Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Инкремент и декремент

Александр Ученик (15), закрыт 1 год назад
int main() {
int a=1,b;
cout<<(a++)*(++a)<<endl;
}
Почему выводится число 3?
Должно быть вроде: 2*3=6
Лучший ответ
Levon Zakaryan Мастер (1387) 1 год назад
не должно быть 6 а должно быть именно 3.
Вначале а = 1
первая часть (а++) - a++ - берем значение, потом инкрементируем, получается 1 (а в переменную записали 2
вторая часть (++а) - ++а - инкрементируем, потом берем значение, было 2, стало 3, её и забрали.
дальше думаю всё понятно, 1*3=3
Александр Ученик (15) 1 год назад
Спасибо большое!
Остальные ответы
Иван Сигаев Искусственный Интеллект (150189) 1 год назад
Это называется "неопределенное поведение"

Видимо одна из форм компилятора решает выражение так
1.(a++) возвращает значение 1, переменная принимает значение 2
2.(++a) переменная принимает значение 3, возвращает значение 3
3. 1*3=3
4. выводим на консоль значение 3
Андрей Высший разум (425838) 1 год назад
Компилятор C++ имеет право менять порядок вычисления подвыражений. И точку внутри вычисления выражения, в которой производится инкремент / декремент, компилятор тоже выбирает сам. Когда в C++ пишешь (a++)*(++a), ты не можешь гарантировать, что a++ выполнится раньше, чем ++a. И, более того, в одном и том же компиляторе при задании разных уровней оптимизации порядок может быть разным.

Потому, твой код - это классический пример UB (undefined behavior, неопределённое поведение).

В соответствии со стандартом C++ в случае UB компилятор имеет право делать что угодно: хоть вернуть погоду на Марсе, хоть вообще выкинуть все вычисления, содержащие UB.

Не хочешь постоянно наступать на грабли - запомни одно простое правило: значение каждой переменной внутри выражения МОЖЕТ МЕНЯТЬСЯ НЕ БОЛЕЕ ОДНОГО РАЗА. При этом надо помнить, что присваивание - это тоже изменение значения внутри выражения.

P.S. И, кстати, в языках с выполнением выражений строго слева направо как раз 3 и будет.
СергейГений (56269) 1 год назад
Хм... хорошая идея для прогноза погоды на Марсе. Маску пригодится!
kaiu Высший разум (115628) 1 год назад
Ленивые жопы придумали си и си++ и не описали правила правильного их использования.
Отсель десятилетиями проблемы с выстрелом в свою ногу.
Иван СигаевИскусственный Интеллект (150189) 1 год назад
Даже математики никак не могут определить
2*3 это два умножить на три или три умножить на два
А куда уж тут компилятору-то с человеком тягаться?
kaiu Высший разум (115628) Иван Сигаев, а в начальной школе вроде договорились или нет? а это 2**3 как тогда придумали?
Евгений Высочин Просветленный (37964) 1 год назад
Происходят действия:
(1, увеличить на 1) * (2 увеличить на 1)
Иван СигаевИскусственный Интеллект (150189) 1 год назад
Точнее так
(1, увеличить на 1) * (увеличить на 1 и вернуть значение 3)

:)
Евгений Высочин Просветленный (37964) Иван Сигаев, ну да
Похожие вопросы