i=5; i=++i + ++i
3678
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
будет увеличена на единицу
Сейчас читают
Прости меня
24238
153
красота и материнство (часть 89)
207602
1000
Похмельный синдром...
6112
58
проверяю кодом (здесь использовал 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 - верен.