【问题标题】:What are lvalues and rvalues? [duplicate]什么是左值和右值? [复制]
【发布时间】:2020-01-03 03:06:01
【问题描述】:

我听说过使用指针时出现的术语 lvaluervalue
但是,我并不完全理解它们的含义。

什么是左值右值

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

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

【问题讨论】:

  • C11 标准草案的第 6.3.2.1 节涵盖了这一点。
  • @JL2210 我暗中怀疑可能是这种情况,但我认为无论如何扔掉它也无妨。
  • @AnttiHaapala 奇怪的是,第 6.3.2.1 节从未使用过“右值”一词,但在 C11 标准草案的索引中,确实出现了“右值”一词,并指出了你到那个部分。编辑:实际上,脚注 64 确实提到了“右值”
  • @ChristianGibbons 这是一个脚注:名称“左值”最初来自赋值表达式 E1 = E2,其中左操作数 E1 必须是(可修改的)左值。将其视为表示对象“定位器值”可能更好。有时被称为“右值”的东西在本国际标准中被描述为“表达式的值”。
  • “右值”是一个无意义的范畴,因为所有左值,如果它们指定一个对象,都可以进行左值转换并成为“右值”。

标签: c rvalue lvalue


【解决方案1】:

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

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

C11 n1570 Footnote 64:

64) lvalue 名称最初来自赋值表达式E1 = E2,其中左操作数E1 必须是(可修改的)左值。将其视为表示对象定位器值可能更好。有时称为 rvalue 在本国际标准中被描述为 表达式的值。左值的一个明显示例是对象的标识符。再举一个例子,如果E 是一个指向对象的一元表达式,那么*E 是一个左值,它指定E 指向的对象。

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

  • 有数组类型,
  • 类型不完整
  • 是 const 限定的
  • structs 或 unions 直接或递归地具有 const-qualified 成员

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

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

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

“可能指定一个对象” 意味着给定int *p;*p 指定一个int 类型的对象iff p 指向一个对象输入int - 但*p 是一个左值,即使p == NULL 或不确定。

【讨论】:

  • 包含“可修改左值”的描述可能有一些价值。
【解决方案2】:

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

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

【讨论】:

  • 除了从一些“C 参考手册”中复制之外,您能否提供一些背景信息?
  • 我认为有很多 cmets 给出了个人解释。我选择引用已接受的文本。
  • 我认为C标准比一些非标准化的手册更容易被接受。您能否至少提供一个指向该材料的链接?
  • @JL2210 我上面引用的文本是:_C: A Reference Manual 3th Edition,作者 Samuel P. Harbison 和 Steele Jr., Guy L. 由 Prentice Hall 出版。在亚马逊上的搜索显示它现在是第 5 版。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2015-08-18
  • 2015-02-06
  • 2013-03-23
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多