我对 -l 值和 r 值感到困惑。考虑代码
int x;
x=5;
和
整数 x
内存空间是为 int 变量保留的。然后,将值 5 分配给它。我的问题是
- 声明意味着 x 是左值?
- 如果 x 在内存中有地址 0xyyyy,&x 指的是这个地址。这个地址 0xyyy 是左值,即 &x 是左值吗?但是, var 的地址是指针,那么,那么,l-value 就变成了指针变量?
据我了解,左值只是您可以分配给表达式的花哨术语。换句话说,如果某个东西可以出现在 = 运算符的左侧,那么它就是一个左值。这意味着x
是一个左值,但&x
不是 - 你不能将 x 的地址重新分配给其他东西。
如果你有一个这样的函数int* getIntPtr()
thengetIntPtr()
不是左值(写作getIntPtr() = 5
没有任何意义),而是*(getIntPtr())
。
编辑:显然,这并不容易。如果 x 被定义为 const,x
它仍然是一个左值(称为不可修改的左值),即使你不能分配给它。我不确定是否还有其他例外。
Anl-value
在作业的左侧是有意义的。都是l-values
也r-values
。是否需要内存与它是否是l-value
. 更重要的是它是否评估到可以存储某些东西的内存位置。
int x = 3;
x+5 = 7; // error
表达式x+5
不是l-value
.
lValue => 如果你可以获取一个表达式的地址,那么它就是一个 lValue。
10 = a; // Can we take the address of 10 ?
rValue => 如果不能取快递的地址,那就是rValue。
a = 10;
仍有一些例外。例如,数组类型是一个lValue,其地址不能被获取或分配。
int a[5] ; // &a => Not valid
a = /* some thing */ // Not valid
你们是对的,但我认为OP的问题可能还有更多。这也是困扰我的事情。
所以
int x;
现在x
是一个左值。但是x究竟是什么?它是内存中可以存储东西的地方吗?但是等等......那将是&x
,这不是左值。
另一个奇怪的事情是,x
它甚至不必在内存中有一个位置。编译器可能会选择始终将其保留在寄存器中。现在是什么使它成为左值?
我认为总结的最好方法是 anlvalue
是编译器使用的一个概念,但它不会出现在运行时。x
可能是左值,因为编译器知道它可以
store $x %ax
(我编了汇编语法;太长了)
或者也许它在一个寄存器中并且它知道它可以
move %bx %ax
基本上,它是一个左值,因为编译器知道如何在“它”中存储一些东西,但你不能抓住那个“它”。
要明确:首先,int x
不为变量保留空间,它只是通知编译器有关变量的信息。空间被保留并在分配值时分配,即当我们这样做时x=5;
。
现在,L-Value 和 R-Value 的问题:
L-Value :它是可以分配一个常数值的东西。所以,是的,x
是一个 L 值。因为我们可以做到x=5;
。但&x
不是 L 值,因为我们做不到&x=5;
。同样,0xyyyy
是地址,可以是 R 值,但不能分配,所以它不是 L 值。