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