Является ли я + = ++ я неопределенным поведением в C ++ 0x? - PullRequest
14 голосов
/ 14 октября 2010

Я очень убежден в объяснении, которое я нашел, в котором говорится, что i = ++i не является неопределенным , что касается C ++ 0x, но я не могу судить, является ли поведение i += ++i четко определено или нет. Любой берущий?

1 Ответ

9 голосов
/ 14 октября 2010

Аргументация, которая делает 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, либо его сбивают с толку, пропустив некоторые важные аспекты рассматриваемого выражения (как это случилось со мной при составлении первой редакции этого ответа).

...