Почему оператор предварительного введения дает RValue в C?
Вопрос
В C ++ оператор предварительного достижения дает LVALUE, потому что сам увеличенный объект возвращается, а не копия. Но в C это дает RVALUE. Почему?
Решение
C не имеет ссылок. В C ++ ++i
возвращает ссылку на i
(lvalue), тогда как в C он возвращает копию (увеличен).
C99 6.5.3.1/2
Значение операнда оператора дофикса ++ увеличивается. Результатом является новое значение операнда после увеличения. Анкет Выражение ++ EIS эквивалентно (e+= 1).
‘‘value of an expression’’ <=> rvalue
Однако по историческим причинам, я думаю, «ссылки, не являющиеся частью C», могут быть возможной причиной.
Другие советы
C99 говорит в сноске (из разделения $ 6,3.2.1),
Имя «lvalue» изначально поступает из выражения выражения e1 = e2, в котором левый операнд E1 должен быть (модифицированный) lvalue. Возможно, это лучше рассматривать как представляющий объект «значение локатора». То, что иногда называют «rvalue», в этом международном стандарте, описанном как «ценность выражения».
Надеюсь, это объясняет, почему ++i
В C возвращает rvalue.
Что касается C ++, я бы сказал, что это зависит от увеличения объекта. Если тип объекта является определенным пользователем типом, то он всегда может возвращать lvalue. Это означает, что вы всегда можете написать i++++++++
или же ++++++i
Если тип i
является Index
как определено здесь:
Неопределенное поведение и точки последовательности перезагрузили
Вне головы я не могу представить каких-либо полезных утверждений, которые могут возникнуть в результате использования предварительно интригментированной переменной в качестве LVALUE. В C ++, из -за существования перегрузки оператора, я могу. У вас есть конкретный пример того, что вам не дает, чтобы в C из -за этого ограничения вам не хватает?