什么是左值和右值?

时间:2019-08-29 19:50:53

标签: c rvalue lvalue

我听说在使用指针时出现了 lvalue rvalue 术语。
但是,我不完全理解它们的含义。

什么是左值右值

注1:这是有关C的左值和右值而不是C ++的问题。这也与他们的功能有关,而不是他们的命名

注2:我已经完全理解了这些概念。这就是规范的重复目标。

2 个答案:

答案 0 :(得分:4)

我有一个更长的答案here,但基本上是C11 draft n1570 6.3.2.1p1

  

左值是一个可能指定对象[...]的表达式(对象类型不是void)

C11 n1570 Footnote 64

  

64)名称左值最初来自赋值表达式E1 = E2,其中左操作数E1必须是(可修改的)左值。最好将其表示为对象定位器值。在本国际标准中,有时称为 rvalue 的内容称为表达式的。左值的一个明显示例是对象的标识符。作为另一个示例,如果E是作为对象指针的一元表达式,则*E是一个左值,它指定E指向的对象。

并非所有左值都是可修改的,即可以出现在赋值的左侧。不可修改的左值的示例是

  • 具有数组类型,
  • 类型不完整
  • 具有const资格
  • 直接或递归具有struct合格成员的unionconst s

可以通过左值转换将左值转换为表达式的值。即在

int a = 0, b = 1;
a = b;

ab都是左值,因为它们都潜在地并且实际上是指定对象,但是b在赋值的右侧进行左值转换,并且左值转换后表达式b的值为1

“可能指定对象” 表示给定int *p;*p指定类型为int的对象 iff {{ 1}}指向类型为p的对象-但是int是左值,即使*p或不确定。

答案 1 :(得分:1)

根据 C参考手册(第三版)

  

lvalue 是一个表达式,它以一种   该对象可能会被检查或更改。只有左值表达式可以   在作业的左侧使用。一个表达是   不是左值有时称为 rvalue ,因为它只能出现   在作业的右侧。左值可以有一个   数组类型不完整,但不是 void