Разница между я = ++ я и ++ i

Возможный дубликат:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

В чем разница между i = ++i; и ++i;, где i - целое число со значением 10?

По моим словам, оба выполняют одно и то же задание приращения i i.e после завершения обоих выражений i =11.

Ответ 1

i = ++i; вызывает Undefined Поведение, тогда как ++i; не работает.

С++ 03 [Раздел 5/4] говорит Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.

В i = ++i i изменяется дважды [pre-increment and assign] без какой-либо промежуточной точки последовательности, поэтому поведение Undefined в C, а также в С++.

Однако i = ++i хорошо определен в С++ 0x:)

Ответ 2

Запись i = ++i; дважды записывается в переменную i (одна для приращения, одна для назначения) без точки последовательности между два. Это, согласно стандарту языка C, вызывает поведение undefined.

Это означает, что компилятор может реализовать i = ++i как идентичный i = i + 1, как i = i + 2 (это действительно имеет смысл в определенных обстоятельствах, связанных с конвейером и кешем) или как format C:\ (глупо, но технически разрешенный стандартом).

Ответ 3

i = ++, я часто, но не обязательно, даю результат

i = i;

i +1;

что дает я = 10

Как отмечалось в комментариях, это поведение undefined и никогда не следует полагаться на

в то время как ++ я ВСЕГДА даст

i = я + 1;

что дает я = 11;

И поэтому правильный способ сделать это

Ответ 4

Если я имеет скалярный тип, то i = ++i - UB, а ++i эквивалентно i+=1. если я относится к типу класса, и для этого класса есть оператор ++, перегруженный i = ++i эквивалентен i.operator=(operator++(i)), который НЕ является UB, а ++i просто выполняет ++ operator, используя любую семантику, которую вы в нее вставляете.

Ответ 5

Результат для первого: undefined.