Есть полные коды. И вывод всегда "4 4 4".
#include <iostream>
int main() {
int a = 1;
int b = 2;
int x = (a = 3, b = ++a);
std::cout << a << ' ' << b << ' ' << x << std::endl;
return 0;
}
Операции имеют порядок, вы можете найти его в любом учебнике или учебнике. Следуя этому порядку, первая операция выполняется в a = 3
, затем ++a
делает a
равным 4, затем b
присваивается новому значению a
(то есть 4), затем x
присваивается новому значению b
, то есть 4
Эта строка int x = (a = 3, b = ++a);
эквивалентна a = 3; b = ++a; int x = b;
, поэтому вывод 4 4 4 — это то, что вы ожидаете.
Я думаю, вы думаете, что ++a
должно произойти первым. Это неверно, a = 3
происходит первым.
Выражение (a = 3, b = ++a)
оценивается слева направо, и значение равно b = ++a
, которое само имеет значение b
. Это присвоено x
. Другими словами, x
будет таким же, как b
.
Кроме того, оператор-разделитель выражений ,
является точкой последовательности, что означает, что a = 3
завершается до оценки b = ++a
.
Таким образом, ++a
равно 4, и ему присваивается b
, что объясняет вывод.
Я бы объяснил это как код, который вы никогда не должны писать.