Смешивание пост- и преинкрементных/декрементных операторов для одной и той же переменной

Возможный дубликат:
Почему ++i считается l-значением, а i++ — нет?

В C++ (а также в C), если я напишу:

++x--
++(x--)

я получаю сообщение об ошибке: lvalue требуется как операнд приращения

Однако (++x)-- компилируется. Я смущен.


person Xolve    schedule 19.07.2010    source источник
comment
Пожалуйста, не делай этого, мне болят глаза. :)   -  person InsertNickHere    schedule 19.07.2010
comment
Возможный дубликат stackoverflow.com/questions/371503/   -  person Péter Török    schedule 19.07.2010
comment
gcc не будет компилировать (++x)-- здесь, g++ будет. То же самое относится и к ++i = 5;   -  person mvds    schedule 19.07.2010
comment
Это действительно не должно компилироваться. Какой компилятор вы используете, поэтому я знаю, что его следует избегать?   -  person nmichaels    schedule 19.07.2010
comment
В C++ (++x)-- синтаксически корректен, но вызывает Undefined Behavior.   -  person Prasoon Saurav    schedule 19.07.2010
comment
Nathon: да, он должен компилироваться. (Стандартное определение оператора ++ в пользовательском классе итератора — iterator & operator++ ())   -  person Ken Bloom    schedule 19.07.2010
comment
@Prasoon: докажи мне, что это не определено. Семантика того, как это работает в пользовательском классе итератора, совершенно ясна.   -  person Ken Bloom    schedule 19.07.2010
comment
@Ken: переменная x изменяется более одного раза между двумя точками последовательности, поэтому в этом случае поведение не определено. Поправьте меня, если я ошибаюсь.   -  person Prasoon Saurav    schedule 19.07.2010
comment
@Prasoon: перед вызовом функции operator-- есть точка последовательности. Существует также точка следования после возврата operator++.   -  person Ken Bloom    schedule 19.07.2010
comment
@Ken: Где он упомянул, что x - это объект, а не примитивный тип? C теги :P   -  person Prasoon Saurav    schedule 19.07.2010
comment
@Кен. Кого волнует, если для какого-то базарного экземпляра это действительно. В большинстве случаев он не определен. Но самое главное, его трудно читать и понимать, и только по этой причине его не следует использовать.   -  person Martin York    schedule 19.07.2010
comment
На самом деле это поднимает интересный вопрос, почему мы не определяем operator++ для возврата константной ссылки.   -  person Ken Bloom    schedule 19.07.2010


Ответы (1)


Пост- и преинкрементные операторы работают только с lvalue.

Когда вы вызываете ++i, значение i увеличивается, а затем возвращается i. В C++ возвращаемое значение является переменной и является lvalue.

Когда вы вызываете i++ (или i--), возвращаемое значение является значением i до того, как оно было увеличено. Это копия старого значения, которая не соответствует переменной i, поэтому ее нельзя использовать в качестве lvalue.

В любом случае, не делайте этого, даже если он компилируется.

person Mark Byers    schedule 19.07.2010
comment
@Jerry: я только что исправил это для него вместе с еще одной незначительной правкой. - person Ken Bloom; 19.07.2010
comment
+1 за Don't do this, even if it compiles.. :-) - person Prasoon Saurav; 19.07.2010