我听说过使用指针时出现术语 lvalue 和 rvalue。
但是,我并不完全理解它们的含义。
什么是左值和右值?
注意:这是一个关于 C 的左值和右值的问题,而不是 C++ 的问题。这也与他们的功能有关,而不是他们的命名。
我有一个更长的答案这里,但基本上是C11草案n1570 6.3.2.1p1:
左值是一个表达式(具有除 void 之外的对象类型),可能指定一个对象 [...]
有数组类型,64) 名称lvalue最初来自赋值表达式
,其中左操作数E1 = E2
需要是(可修改的)左值。也许最好将其视为表示对象定位器值。有时所谓的“右值”在本国际标准中被描述为“表达式的值”。左值的一个明显例子是对象的标识符。作为进一步的示例,如果E1
E
是指向对象的指针的一元表达式,则*E
是指定指向的对象的左值。E
并非所有左值都是可修改的,即可以出现在赋值的左侧。不可修改左值的示例包括
类型不完整
struct
union
const
左值可以通过左值转换
int a = 0, b = 1;
a = b;
a
和
b
都是左值,因为它们都可能并且实际上都指定对象,但是
b
在赋值的右侧进行左值转换,并且表达式 b
的值在赋值之后进行左值转换为 1
。“潜在指定一个对象”表示给定
int *p;
,*p
指定类型为
int
的对象 iff
p
指向类型为 int
的对象 - 但 *p
是左值即使 p == NULL
或不确定。根据C参考手册(第3版)
左值
是一个引用对象的表达式: 该物体可能会被检查或改变。只有左值表达式可以 用在作业的左侧。一个表达式是 不是左值有时被称为rvalue,因为它只能出现 在作业的右侧。左值可以有一个 不完整的数组类型,但不是 void。