技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: LINUX
2014-04-27 20:38:42
我们在看书的时候,经常可以看到关于 左值(L-value) 和 右值(R-value) 的概念,那么到底什么是左值,什么是右值,它们之间的区别又是在哪里呢?
通俗的讲,左值就是能够出现在赋值符号左面的东西,而右值就是那些可以出现在赋值符号右面的东西了。
举个很简单的例子:
a=b+100;
那么这里a就是左值,b+25就是一个右值。左值和右值之间是不一定都能互换的,上面的这个例子就是不能互换的,如果写成
b+100=a;
大家都能看出来这样写会不编译通过的,因为编译器无法判断b+100的内存地址,所以不能操作。
看了这个例子,可以做一个总结,左值必须应该是一个变量或者是表达式等,但是它的物理位置是可以确定的,而右值不一定,这也是它们两者之间的区别。
关于左值是表达式的例子有数组,还有指针这些都可以。
int array[10];
int a=5;
array[a+3]=10; //这里左值就是一个数组表达式了
此文完。
另外:朋友给了一些其他方面的提示 (左值右值翻译可能有些问题)
是否占用内存, 是否存在于符号表中, 是2个正交的概念 xxx.c int global_variable; // 占用内存, 且符号表中存在 int global_array[1212]; // 占用内存, 且符号表中存在 void f(void) { int local_variable; // 占用内存, 符号表中不存在 int local_array[1212]; // 占用内存, 符号表中不存在 } |
左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话)。例如:
int a = 5;
a就是左值,5就是右值。
当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~
左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int))。
更专业的定义在这里:
An object is a region of storage that can be examined and stored into. An lvalue is an expression that refers to such an object. An lvalue does not necessarily permit modification of the object it designates. For example, a const object is an lvalue that cannot be modified.
右值对应的玩意其实也在内存里,但是我们忽略这一点,认为它存在于冥冥之中。例如上边那个5,其实它在静态数据段或者程序二级制代码中,但我们不关心这个,认为它无法修改。
附个链接:
%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm