Давайте перепишем ваш код как
E1 = (E2 = E3)
где E1 - это выражение a
, E2 - это выражение a += 1
, а E3 - выражение 10
. Здесь мы использовали, что оператор присваивания группируется справа налево (§5.17 / 1 в стандарте C ++ 11).
В §5.17 / 1 также говорится:
Во всех случаях присваивание выполняется после вычисления значения правого и левого операндов и перед вычислением значения выражения присваивания.
Применение этого к нашему выражению означает, что мы сначала должны оценить подвыражения E1
и E2 = E3
. Обратите внимание, что между этими двумя оценками нет связи «упорядочено до», но это не вызывает проблем.
Оценка id-выражения E1
тривиальна (результатом является сам a
). Оценка выражения-присваивания E2 = E3
происходит следующим образом:
Сначала нужно вычислить оба подвыражения. Оценка литерала E3
снова тривиальна (дает значение prvalue 10).
Оценка (составного) выражения-присваивания E2
выполняется в следующие шаги:
1) Поведение a += 1
эквивалентно a = a + 1
, но a
оценивается только один раз (§5.17 / 7). После оценки подвыражений a
и 1
(в произвольном порядке) к a
применяется преобразование lvalue-to-rvalue для чтения значения, хранящегося в a
.
2) Значения a
(то есть 0
) и 1
добавляются (a + 1
), и результатом этого сложения является prvalue значения 1
.
3) Прежде чем мы сможем вычислить результат присваивания a = a + 1
, значение объекта, на который ссылается левый операнд, заменяется значением правого операнда (§5.17 / 2). Результатом E2
будет lvalue, относящееся к новому значению 1
. Обратите внимание, что побочный эффект (обновление значения левого операнда) выполняется до вычисления значения выражения присваивания. Это §5.17 / 1, процитированный выше.
Теперь, когда мы вычислили подвыражения E2
и E3
, значение выражения, на которое ссылается E2
, заменяется значением E3
, которое равно 10
. Следовательно, результатом E2 = E3
является lvalue значения 10
.
Наконец, значение выражения, на которое ссылается E1
, заменяется значением выражения E2 = E3
, которое мы вычислили как 10
. Таким образом, переменная a
заканчивается и содержит значение 10
.
Поскольку все эти шаги четко определены, все выражение дает четко определенное значение.
person
MWid
schedule
30.10.2013
<g>
- person Pete Becker   schedule 25.10.2013