1

我对 -l 值和 r 值感到困惑。考虑代码

int x; x=5;

整数 x

内存空间是为 int 变量保留的。然后,将值 5 分配给它。我的问题是

  1. 声明意味着 x 是左值?
  2. 如果 x 在内存中有地址 0xyyyy,&x 指的是这个地址。这个地址 0xyyy 是左值,即 &x 是左值吗?但是, var 的地址是指针,那么,那么,l-value 就变成了指针变量?
4

5 回答 5

2

据我了解,左值只是您可以分配给表达式的花哨术语。换句话说,如果某个东西可以出现在 = 运算符的左侧,那么它就是一个左值。这意味着x是一个左值,但&x不是 - 你不能将 x 的地址重新分配给其他东西。

如果你有一个这样的函数int* getIntPtr()thengetIntPtr()不是左值(写作getIntPtr() = 5没有任何意义),而是*(getIntPtr())

编辑:显然,这并不容易。如果 x 被定义为 const,x它仍然是一个左值(称为不可修改的左值),即使你不能分配给它。我不确定是否还有其他例外。

于 2011-08-27T19:03:51.310 回答
1

Anl-value在作业的左侧是有意义的。都是l-valuesr-values。是否需要内存与它是否是l-value. 更重要的是它是否评估到可以存储某些东西的内存位置。

int  x = 3;

x+5 = 7;    // error

表达式x+5不是l-value.

于 2011-08-27T19:06:25.443 回答
1

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
于 2011-08-27T19:14:03.633 回答
0

你们是对的,但我认为OP的问题可能还有更多。这也是困扰我的事情。

所以

int x;

现在x是一个左值。但是x究竟是什么?它是内存中可以存储东西的地方吗?但是等等......那将是&x,这不是左值。

另一个奇怪的事情是,x它甚至不必在内存中有一个位置。编译器可能会选择始终将其保留在寄存器中。现在是什么使它成为左值?

我认为总结的最好方法是 anlvalue是编译器使用的一个概念,但它不会出现在运行时。x可能是左值,因为编译器知道它可以

store $x %ax

(我编了汇编语法;太长了)

或者也许它在一个寄存器中并且它知道它可以

move %bx %ax

基本上,它是一个左值,因为编译器知道如何在“它”中存储一些东西,但你不能抓住那个“它”。

于 2011-08-27T19:13:34.443 回答
0

要明确:首先,int x不为变量保留空间,它只是通知编译器有关变量的信息。空间被保留并在分配值时分配,即当我们这样做时x=5;

现在,L-Value 和 R-Value 的问题:

L-Value :它是可以分配一个常数值的东西。所以,是的,x是一个 L 值。因为我们可以做到x=5;。但&x不是 L 值,因为我们做不到&x=5;。同样,0xyyyy是地址,可以是 R 值,但不能分配,所以它不是 L 值。

于 2011-08-27T19:15:23.367 回答