i=5; i=++i + ++i
3677
12
Я не понимаю, почему сабж на С может выдает 14?
Кто-нибудь может мне объяснить, так сказать для чайника?
gluber
И еще бывает хуже:
i = (++i)*2 + ++i = 21
i = (++i)*3 + ++i = 25
Из-за такой неоднозначности лучше не пользовать ++i,
а либо (i + 1), либо i++.
gluber
Можно понять так:
++i приводит к i = 5+1 = 6
потом еще раз
++i приводит к i = 6+1 = 7
И только потом заменяет СИ ++i на полученное:
i = ++i + ++i = 7 + 7 = 14
но мой пример это правило не объясняет :безум:
fredd
Ну, правильно понимаете. Примерами на порядок действий в операциях с такими инкрементами-декрементами как раз "чайников" и любят баловать в задачниках по усвоению арифметических действий.

И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.

И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
PN
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
Более того, могут быть как эти значения, так и какие-то другие. Это зависит от порядка операций в скомпилированном коде. Поэтому, собственно, авторы учебников настоятельно не рекомендуют использовать подобные выражения. А хороший компилятор, по идее, должен их обнаруживать и выдавать предупреждения.
PN
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
Хек...
Ясен пень - уверен, т.к. такие утверждения всегда
проверяю кодом (здесь использовал Visual C++ 6.0)
PN
И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.
Не... Грамматику СИ знаем-с :umnik:
Совсем не удивлюсь, т.к. по правилам СИ для выражения
i++ сначало в операторе будет использовано выражение
для i, а только после завершения оператора величина i
будет увеличена на единицу :спок:
fredd
проверяю кодом (здесь использовал Visual C++ 6.0)
Похвально, но, как было сказано выше, зависит от компилятора.
gluber
Я понимаю что тут возможны получения разных вариантов ответа. Но все же меня интересует ответ именно 14. Почему? КАК???
Кто-нибудь может поэтапно объяснить?
gluber
i=5;
i = ++i /*==6*/ ++ /*6++ == 7*/ + i /* 7 + 7 == 14*/
xprogrammer
Не поленился, проверил. Использовал MSVS 2008. Таки да, на C++ дает результат 14. Что интересно, C# дает результат 13. Мое предположение, что C++ генерирует примерно следующий код на асме:
inc i // Первое ++i
inc i // Второе ++i
mov eax, i // Сумма первого и второго
add eax, i
mov i, eax
gluber
меня интересует ответ именно 14. Почему? КАК???
fredd уже ведь объяснил во втором его сообщении в ветке. Вы ответы читаете?
KSergey
абсолютно верно. Если мне память не изменяет, то в правилах компилятора С сказано, что операнды выражений СНАЧАЛА разименовываются, а только потом подставляются. И еще: приоритет ++ операций - выше остальных, кроме скобок.

Так что ответ 14 - верен.:улыб: