"The only operator that gives back a value is the de-referencing operator"

"The only operator that gives back a value is the de-referencing operator"

所以我是C的初学者。 当我在我的一份学习材料中遇到这个时,我正在阅读有关 l 值和 r 值的文本:

"关于赋值运算符=,我们讨论左值和右值。 唯一返回值的运算符是取消引用 运算符。"

这让我感到困惑,因为 increment/decrement 运算符不也给出一个值吗?那么如何取消引用唯一返回值的运算符?

我不同意这位作者。

所有运算符表达式,无论是一元、二元还是三元,都计算为一个值。

即使将我们限制在一元运算符,所有 10 似乎 "give a value back"(例如,表达式的计算结果为一个值):

& - AddressOf: returns 变量的内存地址
* - 取消引用:returns 存储在内存地址的值
! - 逻辑非
~ - 二进制非
++x - 前缀增量
x++ - 后缀增量
--x - 前缀递减
x-- - 后缀递减
sizeof(x) - 大小运算符 (但不是 运行 时间操作)
(type)(x) - Cast 运算符将一种类型的值转换为另一种类型。

如果句子原意是:"The only operator which gives a l-value back is the dereferencing operator.",那么它更有意义,但仍然不完美和不精确:

示例:

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.

我认为这是一个错字,应该说

The only operator which gives an l-value back is the dereferencing operator.

这不完全正确。例如,[].-> 运算符也返回左值(标准拼写没有连字符),这样你就可以写

a[5] = 17;
s.x = 42;
p->y = 17;