根据" C - A Reference Manual",左值是一个表达式,它以一种可以检查或改变对象的方式引用一个对象。
例如,
int ranks[10];
然后是ranks
和ranks+3
左值?由于ranks
(指向数组的第一个元素的指针)和ranks+3
(指向数组的第四个元素的指针)引用对象,我猜它们是左值 - 或者它们不是左值?
答案 0 :(得分:3)
ranks+3
不是左值,原因与1+3
不是左值相同;结果只是一个数字(指针)值,而不是对象的引用。
换句话说,如果ranks + 3
的结果是0xdeadbeef
,则无法写
0xdeadbeef = 10;
出于同样的原因你不能写
4 = 10;
但是,*(ranks+3)
是左值,因为您解除引用指针值;它是ranks
数组的4 th 元素,相当于ranks[3]
。
同样,ranks
不是左值,除非在sizeof
或一元&
运算符的上下文中。由于数组表达式"衰变"对于大多数情境中的指针表达式,你再次了解
ranks = 10;
等同于
0xdeadbeef = 10;
同样,您必须取消引用 ranks
作为*ranks
或ranks[0]
才能成为左值。
答案 1 :(得分:2)
在此上下文中,名称不是左值,但可以使用*
取消引用它们以形成左值。例如:
int ranks[10];
// ranks = 42; <--- doesn't compile! error: assignment to expression with array type
*ranks = 42; // OK: same as ranks[0] = 42
//ranks+3 = 42; <--- error: lvalue required as left operand of assignment
*(ranks+3) = 42; //OK: same as ranks[3] = 42
This answer列出了当数组的名称衰减到指向数组第一个元素的指针时C中的少数情况。在作业的左侧不是其中一种情况。因此,在ranks = ...
中,ranks
是(衰减,充当)指向数组第一个元素的指针。您必须取消引用该指针(*ranks
)以将其中一个数组元素作为左值。
请不要问我左值是多少。我知道它,当我看到它。 :)
在gcc上测试。