«Единственный оператор, который возвращает значение, это оператор разыменования» - PullRequest
1 голос
/ 04 мая 2019

Так что я новичок в C. Я просматривал текст о l-значении и r-значении, когда натолкнулся на это в одном из моих учебных материалов:

"Мы говорим о l-значении и r-значении относительно оператора присваивания =. Единственный оператор, который возвращает значение, это разыменование оператор ".

Это смущает меня, потому что операторы увеличения / уменьшения также не дают значения? Тогда как же разыменование единственного оператора, который возвращает значение?

Ответы [ 2 ]

3 голосов
/ 04 мая 2019

Я думаю, что это опечатка и должен сказать

Единственный оператор, который возвращает l-значение , это оператор разыменования.

Это не совсем верно. Например, операторы [], . и -> также возвращают lvalue (стандартное его написание без дефиса), так что вы можете написать

a[5] = 17;
s.x = 42;
p->y = 17;
1 голос
/ 04 мая 2019

Я не согласен с этим автором.

Все операторные выражения, унарные, двоичные или троичные, оцениваются как значения.

Даже ограничиваясь унарными операторами, все десять из них, похоже, "возвращают значение" (например, выражение оценивается как значение ):

& - AddressOf: возвращает адрес памяти переменной
* - Разыменование: возвращает значение, хранящееся по адресу памяти
! - логическая не
~ - двоичный код не
++x - приращение префикса
x++ - Постфиксный прирост
--x - Префикс декремента
x-- - Постфиксный декремент
sizeof(x) - Оператор размера (однако не во время выполнения)
(type)(x) - Оператор приведения преобразует значение одного типа в другой тип.

Если предложение предназначалось для: «Единственный оператор, который возвращает l-значение - это оператор разыменования.» , тогда он имеет больше смысла, но все еще несовершенный и неточный:

Примеры:

y = x;    // Simple Assignment
*y = x;   // Assignment with dereference operator
y[5] = x; // Wait?  Is this another operator forming an L-Value?
y.f = x;  // Another one?
y->f = x; // The author was clearly wrong.
...