Ответ 1
Обоснование, которое делает i = ++i
корректным, равномерно использоваться для доказательства того, что i += ++i
также должно быть четко определено.
i += ++i
эквивалентен i += (i += 1)
, а для новых правил секвенирования требуется, чтобы присвоение выполнялось перед вычислением значения субэкпозиции i += 1
.
Это означает, что результат выражения i += ++i
должен быть таким же, как и для i = 2 * i + 1
.
Изменить: Я должен пересмотреть свой ответ, потому что поведение undefined в конце концов.
Поведение i += ++i
составляет undefined, потому что вычисления значений подвыражений i
(аргумент левой стороны) и ++i
не связаны друг с другом по порядку, а одно из них содержит обновление объект i
.
Это не проблема для выражения i = ++i
, так как там i
в левой части не проходит преобразование lvalue-to-r, что происходит в случае i += ++i
.
На стороне заметки: не пишите такой код в каком-либо серьезном проекте. Он слишком полагается на то, чтобы точно знать правила секвенирования, и будет много людей, которые либо неправильно понимают правила секвенирования, либо не знают об изменениях в правилах, которые являются результатом DR 637, или могут быть сбиты с ног, аспекты рассматриваемого выражения (как это случилось со мной при составлении первой ревизии этого ответа).