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

Ну, правильно понимаете. Примерами на порядок действий в операциях с такими инкрементами-декрементами как раз "чайников" и любят баловать в задачниках по усвоению арифметических действий.
И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?Более того, могут быть как эти значения, так и какие-то другие. Это зависит от порядка операций в скомпилированном коде. Поэтому, собственно, авторы учебников настоятельно не рекомендуют использовать подобные выражения. А хороший компилятор, по идее, должен их обнаруживать и выдавать предупреждения.
И вы уверены, что во втором посту у вас в обоих выражениях верные значения?Хек...
Ясен пень - уверен, т.к. такие утверждения всегда
проверяю кодом (здесь использовал Visual C++ 6.0)
И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.Не... Грамматику СИ знаем-с

Совсем не удивлюсь, т.к. по правилам СИ для выражения
i++ сначало в операторе будет использовано выражение
для i, а только после завершения оператора величина i
будет увеличена на единицу

Сейчас читают
Осел
103275
516
Если позабыть об убогости мужчин.
43384
260
Хакни их всех! или Деньгами не надо, советом мне дай! NF
116421
389
проверяю кодом (здесь использовал Visual C++ 6.0)Похвально, но, как было сказано выше, зависит от компилятора.
Я понимаю что тут возможны получения разных вариантов ответа. Но все же меня интересует ответ именно 14. Почему? КАК???
Кто-нибудь может поэтапно объяснить?
Кто-нибудь может поэтапно объяснить?
xprogrammer
member
i=5;
i = ++i /*==6*/ ++ /*6++ == 7*/ + i /* 7 + 7 == 14*/
i = ++i /*==6*/ ++ /*6++ == 7*/ + i /* 7 + 7 == 14*/
wowik_2
activist
Не поленился, проверил. Использовал MSVS 2008. Таки да, на C++ дает результат 14. Что интересно, C# дает результат 13. Мое предположение, что C++ генерирует примерно следующий код на асме:
inc i // Первое ++i
inc i // Второе ++i
mov eax, i // Сумма первого и второго
add eax, i
mov i, eax
inc i // Первое ++i
inc i // Второе ++i
mov eax, i // Сумма первого и второго
add eax, i
mov i, eax
меня интересует ответ именно 14. Почему? КАК???fredd уже ведь объяснил во втором его сообщении в ветке. Вы ответы читаете?
абсолютно верно. Если мне память не изменяет, то в правилах компилятора С сказано, что операнды выражений СНАЧАЛА разименовываются, а только потом подставляются. И еще: приоритет ++ операций - выше остальных, кроме скобок.
Так что ответ 14 - верен.
Так что ответ 14 - верен.
