Почему оператор предварительного введения дает RValue в C?

StackOverflow https://stackoverflow.com/questions/4802315

  •  22-10-2019
  •  | 
  •  

Вопрос

В 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 из -за этого ограничения вам не хватает?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top