0

k=++p+p++ каким образом вычисляется это выражение?

#include <iostream> using namespace std; int main() { int k; int p=3; k=++p+p++; cout << k; return 0; } Результат работы программы 9, я получаю 8. k=4+4 => p=5 k=8 Где я ошибаюсь в своих вычислениях?

2nd Mar 2017, 6:19 AM
Юрий Исаев
Юрий Исаев - avatar
5 ответов
+ 3
Такс! P = 3 K = ++P + P++; Компилятор вещь довольно ясная, но в то же время непонятная... И в человековом идеале этот код должен выводить 8, однако, он считает иначе... Операторы инкремента имеют высокий приоритет, т.е. выполняются раньше прочих. Так ++P и P++ выполняются здесь самыми первыми. Т.е. так: K = (++P) + (P++) Ну... и... P = 5 уже... 10 получится... А вот тут вступает в силу еще один ньанс, связанный с постфиксным инкрементом... Оператор этот увеличивает значение переменной, а возвращает-то изначальное! И строку: K = ++P + P++; Можно разобрать на: 1. ++P P = 4 2. P++ P = 5, вместо 5 подставляем предыдущее, т.е 4 o_O 3. P + 4 5 + 4... Сколь у нас там... Ааааа 8!) 4. Засовываем всю эту чушь в K, K = 9 Надеюсь, хоть сколь-нибудь понятно объяснил, но это вряд ли =)
4th Mar 2017, 3:19 PM
SUPER_S
SUPER_S - avatar
+ 3
Это C++, а значит сумма менятся может) Сорян, туплю... Undefined behavior не может быть короче 2 операторов... А, значит, этот случай описывается вышеприведенным алгоритмом! P = 3 K = (P++) + (++P) 1. P++ // вместо Р++ ставим изначальное значение (т.е 3) и запоминаем, что P увеличился на 1 P = 4 K = 3 + (++P) 2. ++P // вместо ++P ставим просто P и запоминаем, что P увеличился на 1 P = 5 K = 3 + P K = 3 + 5 = 8 Сходится?) P.s. Но большинство случаев "От перестановки мест слагемых результат не... КАКОГО...?!" всё-таки относятся к undefined behavior ( правда они длиннее и инкрементов в них больше)
4th Mar 2017, 5:12 PM
SUPER_S
SUPER_S - avatar
+ 2
Почему в таком случае при p=3, k=(p++)+(++p) даёт 8. При перемене мест слагаемых сумма меняться не должна.
4th Mar 2017, 3:54 PM
Юрий Исаев
Юрий Исаев - avatar
+ 2
Теперь все понятно, огромнейшее спасибо!
4th Mar 2017, 4:17 PM
Юрий Исаев
Юрий Исаев - avatar
+ 1
Шаг 2 не понял. k=4+(текущее значение p с последующим инкрементом p=4) в k получаем 8 а p=5. Или, как я понял из объяснения, пост инкремент изменяет значение ++p, увеличивая его ещё на 1?
4th Mar 2017, 3:34 PM
Юрий Исаев
Юрий Исаев - avatar