我听说在使用指针时出现了 lvalue 和 rvalue 术语。
但是,我不完全理解它们的含义。
什么是左值和右值?
注1:这是有关C的左值和右值而不是C ++的问题。这也与他们的功能有关,而不是他们的命名。
注2:我已经完全理解了这些概念。这就是规范的重复目标。
答案 0 :(得分:4)
我有一个更长的答案here,但基本上是C11 draft n1570 6.3.2.1p1:
左值是一个可能指定对象[...]的表达式(对象类型不是void)
64)名称左值最初来自赋值表达式
E1 = E2
,其中左操作数E1
必须是(可修改的)左值。最好将其表示为对象定位器值。在本国际标准中,有时称为 rvalue 的内容称为表达式的值。左值的一个明显示例是对象的标识符。作为另一个示例,如果E
是作为对象指针的一元表达式,则*E
是一个左值,它指定E
指向的对象。
并非所有左值都是可修改的,即可以出现在赋值的左侧。不可修改的左值的示例是
struct
合格成员的union
或const
s 可以通过左值转换将左值转换为表达式的值。即在
int a = 0, b = 1;
a = b;
a
和b
都是左值,因为它们都潜在地并且实际上是指定对象,但是b
在赋值的右侧进行左值转换,并且左值转换后表达式b
的值为1
。
“可能指定对象” 表示给定int *p;
,*p
指定类型为int
的对象 iff {{ 1}}指向类型为p
的对象-但是int
是左值,即使*p
或不确定。
答案 1 :(得分:1)
根据 C参考手册(第三版):
lvalue 是一个表达式,它以一种 该对象可能会被检查或更改。只有左值表达式可以 在作业的左侧使用。一个表达是 不是左值有时称为 rvalue ,因为它只能出现 在作业的右侧。左值可以有一个 数组类型不完整,但不是 void 。