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 Где я ошибаюсь в своих вычислениях?
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
Надеюсь, хоть сколь-нибудь понятно объяснил, но это вряд ли =)
+ 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 ( правда они длиннее и инкрементов в них больше)
+ 2
Почему в таком случае при p=3,
k=(p++)+(++p) даёт 8. При перемене мест слагаемых сумма меняться не должна.
+ 2
Теперь все понятно, огромнейшее спасибо!
+ 1
Шаг 2 не понял. k=4+(текущее значение p с последующим инкрементом p=4) в k получаем 8 а p=5. Или, как я понял из объяснения, пост инкремент изменяет значение ++p, увеличивая его ещё на 1?