Я не могу найти окончательный ответ для этого: имеет ли следующий код поведение undefined?
int x = 2;
x+=x+=x+=2.5;
Я не могу найти окончательный ответ для этого: имеет ли следующий код поведение undefined?
int x = 2;
x+=x+=x+=2.5;
Поведение undefined. Посмотрим на несколько более простое выражение:
x += (x+=1)
В С++ 11 вычисление значения левого x
не влияет на вычисление значения выражения (x+=1)
. Это означает, что вычисление значения x
не зависит от назначения к x
(из-за x+=1
), и поэтому поведение undefined.
Причиной этого является то, что вычисление значений двух сторон оператора +=
не зависит от друг друга (поскольку стандарт не указывает иначе). И 1.9p15 утверждает:
Если побочный эффект скалярного объекта не зависит от другого побочного эффекта для одного и того же скалярного объекта или вычисления значения с использованием значения одного и того же скалярного объекта, поведение undefined.
В С++ 03 поведение undefined, потому что x
изменяется дважды без промежуточной точки последовательности.
Для стандартных котировок см. другие ответы. В этом случае он может найти одно из двух разных типов поведения.
x += (x += 2);
Может быть,
x = 2 + 4 (= 6)
если значение x с левой стороны оценивается до x+=2
или
x = 4 + 4 (= 8)
если впоследствии будет определено значение x для левого оператора.
Я знаю, что я не собираюсь так много фанатов, если я скажу, что мне не нравятся те, что "все может случиться". Это правда, что любой компилятор может объявить себя стандартным согласным, независимо от того, как обсуждаемое здесь утверждение обрабатывается относительно значения x. Тем не менее, я думаю, это не означает, что оператор + = может привести к неправильному результату или что скобки могут быть проигнорированы. Поведение Undefined не совпадает с поведением undefined в любом другом случае.
Плохо вернуться к ожиданию поведения undefined, но в приведенном выше примере я вижу веские причины пренебрегать любым возможным результатом, но 6 и 8.
Кроме того, я действительно подозреваю, что x будет 8 после оценки int x=2; x += (x += 2);
для большинства установленных компиляторов (clang, g++, vc, icpc...).
Еще раз повторюсь, что вы не должны полагаться на такое поведение, но это не значит, что оно совершенно непредсказуемо.