Вопрос

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

Это было полезно?

Решение

Рассуждение, которое делает 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-to-rvalue, которое происходит в i += ++i кейс.


На стороне: не пишите такого кода в любом серьезном проекте. Он слишком много опирается на ровно знание правил секвенирования, и будет много людей, которые либо не правильно понимают правила секвенирования, не знают об изменении правил, являющихся результатом доктора 637, либо побуждено пропустить некоторые важные Аспекты рассматриваемого выражения (как случилось со мной при составлении первого пересмотра этого ответа).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top