2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 ++i + ++i = вынос мозга
Сообщение21.11.2009, 01:15 


10/06/09
111
Код:
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 
Заслуженный участник


09/08/09
3438
С.Петербург
Потому, что в C++
Код:
i = ++i + ++i;
это
Код:
++i;
++i;
i = i+i;
:)

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 02:50 


10/06/09
111
Спасибо большое! Ваш ответ очень нагляден. Теперь я даже могу объяснить, почему
Код:

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 
Заслуженный участник


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

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 18:38 


23/12/08
245
Украина
можна маленький вопрос, а что может с++ выдать вместо 11?

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 20:31 
Заслуженный участник


27/04/09
28128
venco в сообщении #264034 писал(а):
А вообще в C/C++ такие конструкции - undefined behavior
Думаю, надо было с этого и начать. :wink:

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение21.11.2009, 20:43 
Заслуженный участник


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

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение22.11.2009, 20:41 
Заслуженный участник


15/05/05
3445
USA
Maslov в сообщении #264236 писал(а):
Да даже в тех языках, где такие штуки регламентируются стандартом, это ж только в кошмарном сне ... :)
Встречаются любители задавать такого рода вопросы на интервью. Так что знать такие трюки не помешает.

 Профиль  
                  
 
 Re: ++i + ++i = вынос мозга
Сообщение22.11.2009, 23:38 


10/06/09
111
Цитата:
А вообще в 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 
Заслуженный участник


04/05/09
4587
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group