Разница между я = ++ я и ++ 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.
Ответ 6
Эти выражения связаны с точками последовательности, и, что самое главное, первый результат undefined поведение.