2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 ++i + ++i = вынос мозга
Сообщение21.11.2009, 01:15 
Код:
int i = 1;
i = ++i + ++i;
cout<<i; //6
...
int i =1;
i = i++ + i++;
cout<<i;//4
...
int i =1;
i = i++;
cout<<i;//1


Почему так происходит?

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 01:46 
Потому, что в C++
Код:
i = ++i + ++i;
это
Код:
++i;
++i;
i = i+i;
:)

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 02:50 
Спасибо большое! Ваш ответ очень нагляден. Теперь я даже могу объяснить, почему
Код:

i = i++ + i++ + i++ + ++i;
cout<<i; //8


потому что это:
Код:
i =  i + i + i + (1 + i);//5
i++;//6
i++;//7
i++;//8


Ещё раз спасибо!!!!!

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 08:07 
А вообще в C/C++ такие конструкции - undefined behavior, т.е. стандарт позволяет компиляторам странслировать их в произвольный код, включая форматирование винчестера. В реальности, конечно, компиляторы сами себе этого не позволяют, но результат может получиться самый разный, в завимости и от параметров компиляции, например, уровня оптимизации. Поэтому настоятельно не рекомендую так писать.
Кстати, Java стандарт строго регламентирует, что должно получиться в таких случаях, но совсем по другому.
Например, вот это:
Код:
        int i = 1;
        i = i++ + i++ + i++ + ++i;
даст 11.
Догадайтесь, почему.

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 18:38 
можна маленький вопрос, а что может с++ выдать вместо 11?

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 20:31 
venco в сообщении #264034 писал(а):
А вообще в C/C++ такие конструкции - undefined behavior
Думаю, надо было с этого и начать. :wink:

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 20:43 
arseniiv в сообщении #264231 писал(а):
venco в сообщении #264034 писал(а):
А вообще в C/C++ такие конструкции - undefined behavior
Думаю, надо было с этого и начать. :wink:
Да даже в тех языках, где такие штуки регламентируются стандартом, это ж только в кошмарном сне ... :)

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение22.11.2009, 20:41 
Maslov в сообщении #264236 писал(а):
Да даже в тех языках, где такие штуки регламентируются стандартом, это ж только в кошмарном сне ... :)
Встречаются любители задавать такого рода вопросы на интервью. Так что знать такие трюки не помешает.

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение22.11.2009, 23:38 
Цитата:
А вообще в C/C++ такие конструкции - undefined behavior, т.е. стандарт позволяет компиляторам странслировать их в произвольный код, включая форматирование винчестера. В реальности, конечно, компиляторы сами себе этого не позволяют, но результат может получиться самый разный, в завимости и от параметров компиляции, например, уровня оптимизации. Поэтому настоятельно не рекомендую так писать.
Кстати, Java стандарт строго регламентирует, что должно получиться в таких случаях, но совсем по другому.
Например, вот это:

Код:
        int i = 1;
        i = i++ + i++ + i++ + ++i;

даст 11.
Догадайтесь, почему.


Ну, видимо,в Java стандарте приоритет префиксного инкремента выше, чем у большинства операций(в частности, выше чем постфиксного инкремента).
Поэтому данный код "равносилен" такому:
Код:
int i = 1;
++i;//2
i = i + i + i +i;//8
i++;//9
i++;//10
i++;//11

 
 
 
 Re: ++i + ++i = вынос мозга
Сообщение23.11.2009, 02:29 
malin в сообщении #264535 писал(а):
Цитата:
Кстати, Java стандарт строго регламентирует, что должно получиться в таких случаях, но совсем по другому.
Например, вот это:

Код:
        int i = 1;
        i = i++ + i++ + i++ + ++i;

даст 11.
Догадайтесь, почему.


Ну, видимо,в Java стандарте приоритет префиксного инкремента выше, чем у большинства операций(в частности, выше чем постфиксного инкремента).
Поэтому данный код "равносилен" такому:
Код:
int i = 1;
++i;//2
i = i + i + i +i;//8
i++;//9
i++;//10
i++;//11
Неправильно. Если убрать одно i++, то Java даст 7, а не 8, как получилось бы с вашими рассуждениями.
Особенность Java в том, что, во первых, результат инкремента в переменную записывается немедленно, и, во вторых, операнды вычисляются слева направо.
Выражение i = i++ + i++ + ++i выполняется так:
1. первый операнд равен 1, в i записывается 2.
2. второй операнд равен 2, в i записывается 3.
3. третий операнд равен 4, и в i записывается тоже 4.
4. наконец, i = 1 + 2 + 4 = 7.
В случае с четырьмя операндами i = 1 + 2 + 3 + 5 = 11.

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group