Levon Zakaryan
Мастер
(1387)
1 год назад
не должно быть 6 а должно быть именно 3.
Вначале а = 1
первая часть (а++) - a++ - берем значение, потом инкрементируем, получается 1 (а в переменную записали 2
вторая часть (++а) - ++а - инкрементируем, потом берем значение, было 2, стало 3, её и забрали.
дальше думаю всё понятно, 1*3=3
Андрей
Высший разум
(425838)
1 год назад
Компилятор C++ имеет право менять порядок вычисления подвыражений. И точку внутри вычисления выражения, в которой производится инкремент / декремент, компилятор тоже выбирает сам. Когда в C++ пишешь (a++)*(++a), ты не можешь гарантировать, что a++ выполнится раньше, чем ++a. И, более того, в одном и том же компиляторе при задании разных уровней оптимизации порядок может быть разным.
Потому, твой код - это классический пример UB (undefined behavior, неопределённое поведение).
В соответствии со стандартом C++ в случае UB компилятор имеет право делать что угодно: хоть вернуть погоду на Марсе, хоть вообще выкинуть все вычисления, содержащие UB.
Не хочешь постоянно наступать на грабли - запомни одно простое правило: значение каждой переменной внутри выражения МОЖЕТ МЕНЯТЬСЯ НЕ БОЛЕЕ ОДНОГО РАЗА. При этом надо помнить, что присваивание - это тоже изменение значения внутри выражения.
P.S. И, кстати, в языках с выполнением выражений строго слева направо как раз 3 и будет.
СергейГений (56269)
1 год назад
Хм... хорошая идея для прогноза погоды на Марсе. Маску пригодится!
int a=1,b;
cout<<(a++)*(++a)<<endl;
}
Почему выводится число 3?
Должно быть вроде: 2*3=6