Вопрос № 100401: Мне попался следующий код:
int i=5;
i= ++i + ++i;
Чему равно i? Проверял на VS2005 получилось 14, почему? Ведь после первого инкремента должно быть 6, а после второго 7 т.е. в сумме 13, а получается как я понял 7+7....
Вопрос № 100.401
Мне попался следующий код:
int i=5;
i= ++i + ++i;
Чему равно i? Проверял на VS2005 получилось 14, почему? Ведь после первого инкремента должно быть 6, а после второго 7 т.е. в сумме 13, а получается как я понял 7+7.
Отвечает: din
Здравствуйте, Виктор Малейчик!
Все просто. Когда у вас выполняется инкрементирование в первый раз i равно 6, во второй раз равно 7, потом выполняется i = i+i где i равно 7. Для большей наглядности подставляем вместо i ее значение i = 7+7 (а не 6+7, i после второко инкремента равно уже 7 а не 6).
Удачи!
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Практикант)
Ответ отправлен: 01.09.2007, 00:50 Оценка за ответ: 4
Отвечает: Aristos
Здравствуйте, Виктор Малейчик!
Строку
i = ++i + ++i;
можно представить так:
++i;
++i;
i = i + i;
Отсюда ответ очевиден. В приложении asm код, который генерит компилятор.
Приложение:
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 01.09.2007, 01:08 Оценка за ответ: 4
Отвечает: Rockie
Здравствуйте, Виктор Малейчик!
Дело в том, что результат этой операции - undefined behavior, "результат неопределен". Это значит, что в итоге можно получить что угодно - 13, 14, -123, format c:, и т.д. =) Это связано с наличием точек следования при разборе выражений компилятором. Подробнее можете почитать по ссылкам:
Точки следования (sequence points)
http://alenacpp.blogspot.com/2005/11/sequence-points.html
Ответ отправил: Rockie (статус: 3-ий класс)
Ответ отправлен: 01.09.2007, 01:32 Оценка за ответ: 5
Отвечает: Архипов Александр Леонидович
Здравствуйте, Виктор Малейчик!
Всё правильно, просто вначале к i прибавляется 1, и получается i=6. Затем опять к i прибавляется 1 и получается 7, а уже потом два i складываются, но на этот момент i уже равно 7 и получается 7+7=14.
Ответ отправил: Архипов Александр Леонидович (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 07:31 Оценка за ответ: 4
Отвечает: Shurka
Здравствуйте, дорогой товарищ!
Но тут все относительно просто.
Дело вот в чем. Понятно, что сначала вычисляются слагаемые. Но дело в том,
что компилятор не копирует переменную i. Для него есть только ее адрес в памяти. Обозначим его А.
Поэтому вычисляя первый операнд, компилятор выдаст команду "увеличить содержимое адреса А на единицу", вычисляя второй операнд он СНОВА выдаст эту же команду: "увеличить содержимое адреса А на единицу". И наконец, складывая оба операнда он выдаст команду "сложить содержимое адреса А с содержимым адреса А".
Теперь надеюсь понятно, почему получиться 14.
// (* С++ до конца не знает никто *) //
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 09:23 Оценка за ответ: 4
Отвечает: kool
Здравствуйте, Виктор Малейчик!
Все дело в приоритете унарной операции ++
над бинарной +, кот складывает два значения i.
Т.е. сначала
i==5
++i (i==6)
++i (i==7)
i+i==7+7=14
Выход - сделать так: i= ++i + i++;
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 01.09.2007, 12:04 Оценка за ответ: 4