Имеем код:
int i=1;
i += ++i;
после выполнения получаем i = 3;
меняем код:
int i=1;
i += i++;
после выполнения получаем i = 2;
Вопрос: почему так?
Здравствуйте, blind_petrik, Вы писали:
_>Вопрос: почему так?
Вот поэтому и не надо так писать.

... << RSDN@Home 1.2.0 alpha rev. 786>>
L>Вот поэтому и не надо так писать.
Это и так понятно. Писать так не собираюсь.
Но все равно. Мне хочется понять почему получается так как получается. Интересно мне
Здравствуйте, blind_petrik, Вы писали:
L>>Вот поэтому и не надо так писать.
_>Это и так понятно. Писать так не собираюсь.
_>Но все равно. Мне хочется понять почему получается так как получается. Интересно мне
Ща попробую как я это понимаю. Если что, более опытные товарищи поправят.
1 случай:
i += ++i;
эквивалентно
i = i + (++i);
Начинаем вычислять "i + (++i)" учитывая что i = 1.
1 шаг: заместо 1-го i ставим 1.
Получаем 1 + (++ i), при этом все так же i = 1.
2 шаг: вычисляем ++i. Значение выражение равно 2, кроме того переменная i становится равной 2.
Получаем 1 + 2, при этом i = 2.
Итог:
i = 3;
2 случай:
i += i++;
эквивалентно
i = i + (i++);
Начинаем вычислять "i + (i++)" учитывая что i = 1.
1 шаг: заместо 1-го i ставим 1.
Получаем 1 + (i++), при этом все так же i = 1.
2 шаг: вычисляем i++. Значение выражение равно 1, кроме того переменная i становится равной 2.
Получаем 1 + 1, при этом i = 2.
Итог:
i = 2;
... << RSDN@Home 1.2.0 alpha rev. 786>>
Здравствуйте, blind_petrik, Вы писали:
_>Вопрос: почему так?
Undefined behavior... но я не нашел описание описание этого issue в стандарте
Здравствуйте, usov, Вы писали:
U>Undefined behavior... но я не нашел описание описание этого issue в стандарте
Это Вы про какой язык?
Здравствуйте, blind_petrik, Вы писали:
_>Имеем код:
_>_>int i=1;
_>i += ++i;
_>
_>после выполнения получаем i = 3;
_>меняем код:
_>_>int i=1;
_>i += i++;
_>
_>после выполнения получаем i = 2;
_>Вопрос: почему так?
потому что ++i и i++ это разные операции, первая префиксная, вторая постфиксная, они не эквивалентны. Первая прибавляет к i единицу и возвращает новое значение i, вторая увеличивает i на единицу и возвращает значение i, которое было до прибавления единицы.
... << RSDN@Home 1.2.0 alpha rev. 676>>