什么是左值和右值? [重复]

问题描述 投票:0回答:2

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

什么是左值右值

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

c rvalue lvalue
2个回答
4
投票

我有一个更长的答案这里,但基本上是C11草案n1570 6.3.2.1p1

左值是一个表达式(具有除 void 之外的对象类型),可能指定一个对象 [...]

C11 n1570 脚注 64

64) 名称lvalue最初来自赋值表达式

E1 = E2
,其中左操作数
E1
需要是(可修改的)左值。也许最好将其视为表示对象定位器值。有时所谓的“右值”在本国际标准中被描述为“表达式的值”。左值的一个明显例子是对象的标识符。作为进一步的示例,如果 E 是指向对象的指针的一元表达式,则 *E 是指定
E
指向的对象的左值。


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

有数组类型,

类型不完整
  • 具有 const 资格
  • 直接或递归地具有
  • struct
  • 合格成员的
  • union
  • const
    
    
    
    左值可以通过
    左值转换
  • 转换为表达式的值。 IE。在

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

a
b

都是左值,因为它们都可能并且实际上都指定对象,但是

b
在赋值的右侧进行左值转换,并且表达式
b
的值在赋值之后进行左值转换为
1

“潜在指定一个对象”
表示给定

int *p;

*p 指定类型为

int
的对象
iff
p
指向类型为 int 的对象 - 但
*p
是左值即使
p == NULL
或不确定。
    
根据

C参考手册(第3版)

1
投票

左值

是一个引用对象的表达式: 该物体可能会被检查或改变。只有左值表达式可以 用在作业的左侧。一个表达式是 不是左值有时被称为
rvalue

,因为它只能出现 在作业的右侧。左值可以有一个 不完整的数组类型,但不是 void

© www.soinside.com 2019 - 2024. All rights reserved.