所以我是C的初学者。 当我在其中一份学习资料中遇到有关l值和r值的文字时:
”“我们讨论关于赋值运算符=的l值和r值。 唯一返回值的运算符是取消引用 运算符。”
这使我感到困惑,因为递增/递减运算符也不提供值吗?那么,如何取消引用唯一返回值的运算符呢?
答案 0 :(得分:3)
我认为这是一个错字,应该说
唯一返回 l值的运算符是解引用运算符。
这并非完全正确。例如,[]
,.
和->
运算符还返回左值(标准拼写,不带连字符),以便您可以编写
a[5] = 17;
s.x = 42;
p->y = 17;
答案 1 :(得分:1)
我不同意这个作者。
所有运算符表达式,无论是一元,二进制还是三进制,都将求值。
即使将自己限制为一元运算符,所有这些 ten 似乎也会“返还价值” (例如,表达式求值值):
&
-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.