Возможный дубликат:
Почему ++i считается l-значением, а i++ — нет?
В C++ (а также в C), если я напишу:
++x--
++(x--)
я получаю сообщение об ошибке: lvalue требуется как операнд приращения
Однако (++x)--
компилируется. Я смущен.
Возможный дубликат:
Почему ++i считается l-значением, а i++ — нет?
В C++ (а также в C), если я напишу:
++x--
++(x--)
я получаю сообщение об ошибке: lvalue требуется как операнд приращения
Однако (++x)--
компилируется. Я смущен.
Пост- и преинкрементные операторы работают только с lvalue.
Когда вы вызываете ++i
, значение i
увеличивается, а затем возвращается i
. В C++ возвращаемое значение является переменной и является lvalue.
Когда вы вызываете i++
(или i--
), возвращаемое значение является значением i
до того, как оно было увеличено. Это копия старого значения, которая не соответствует переменной i
, поэтому ее нельзя использовать в качестве lvalue.
В любом случае, не делайте этого, даже если он компилируется.
Don't do this, even if it compiles.
. :-)
- person Prasoon Saurav; 19.07.2010
gcc
не будет компилировать(++x)--
здесь,g++
будет. То же самое относится и к++i = 5;
- person mvds   schedule 19.07.2010(++x)--
синтаксически корректен, но вызывает Undefined Behavior. - person Prasoon Saurav   schedule 19.07.2010iterator & operator++ ()
) - person Ken Bloom   schedule 19.07.2010x
изменяется более одного раза между двумя точками последовательности, поэтому в этом случае поведение не определено. Поправьте меня, если я ошибаюсь. - person Prasoon Saurav   schedule 19.07.2010operator--
есть точка последовательности. Существует также точка следования после возвратаoperator++
. - person Ken Bloom   schedule 19.07.2010x
- это объект, а не примитивный тип?C
теги :P - person Prasoon Saurav   schedule 19.07.2010operator++
для возврата константной ссылки. - person Ken Bloom   schedule 19.07.2010