Подтвердить что ты не робот

Почему оператор pre-increment дает rvalue в C?

В С++ оператор pre-increment дает lvalue, потому что возвращается сам экземпляр объекта, а не копия. Но в C он дает rvalue. Зачем?

4b9b3361

Ответ 1

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

C99 6.5.3.1/2

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

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

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

Ответ 2

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

Первоначальное имя 'lvalue из выражения присваивания E1 = E2, в котором левый операнд E1 равен должен быть (модифицируемым) значением l. Это, пожалуй, лучше рассматривать как представляющий объект "локатор" стоимость. То, что иногда называют 'Rvalue находится в этом Интернационале Стандарт описывается как "значение выражение.

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


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

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

Ответ 3

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