Почему оператор предварительного приращения дает r-значение в C? - PullRequest
28 голосов
/ 26 января 2011

В C ++ оператор предварительного увеличения выдает lvalue, потому что возвращается увеличенный объект, а не его копия.Но в C это дает значение.Зачем?

Ответы [ 3 ]

16 голосов
/ 26 января 2011

C не имеет ссылок.В C ++ ++i возвращает ссылку на i (lvalue), тогда как в C он возвращает копию (увеличенную).

C99 6.5.3.1/2

Значение операнда оператора префикса ++ увеличивается. Результатом является новое значение операнда после увеличения .Выражение ++ E эквивалентно (E + = 1).

‘‘value of an expression’’ <=> rvalue

Однако по историческим причинам я думаю, что «ссылки, не являющиеся частью C» могут быть возможной причиной.

3 голосов
/ 26 января 2011

C99 говорит в сноске (из раздела $ 6.3.2.1),

Имя '' lvalue '' происходит от выражения присваивания E1 = E2, в котором требуется левый операнд E1быть (изменяемым) значением.Возможно, это лучше рассматривать как представление объекта «значение локатора». То, что иногда называют «rvalue», в этом международном стандарте описывается как «значение выражения» .

Надеюсь, что это объясняет, почему ++i в C возвращает значение r.


Что касается C ++, я бы сказал, что это зависит от объекта, который увеличивается.Если тип объекта - некоторый определенный пользователем тип, то он всегда может возвращать lvalue.Это означает, что вы всегда можете написать i++++++++ или ++++++i, если тип i равен Index как определено здесь:

Неопределенное поведение и точки последовательности перезагружены

2 голосов
/ 26 января 2011

Вдобавок ко всему, я не могу представить никаких полезных утверждений, которые могли бы возникнуть в результате использования предварительно увеличенной переменной в качестве значения l.В C ++ из-за существования перегрузки операторов я могу.У вас есть конкретный пример того, что вам запрещено делать в C из-за этого ограничения?

...