当前位置:主页   - 电脑 - 程序设计 - C/C++
C和C++里面的lvalue 和 rvalue的释义
来源:网络   作者:   更新时间:2012-03-03
收藏此页】    【字号    】    【打印】    【关闭

  在看GCC的文档的时候,看到一个词lvalue,查了金山词霸其释义为 lvalue [计] 左值。因为的确在介绍编译原理的课程中听过这个词,大致知道其意思就没有多想。但是看完GCC文档的这个篇幅,都无法明白全篇在说什么。问题还是出在了lvalue这个词的“左值”是什么意思的理解上了。再找M-W字典,却告知没有这个词。于是google了一把,的确很多地方都称其为左值,我仍然不得要领。最后在一个百科网站About Site上找到该词的准确释义,摘贴如下:

  Definition: C and C++ have the notion of lvalues and rvalues associated with variables and constants. The rvalue is the data value of the variable, that is, what information it contains. The "r" in rvalue can be thought of as "read" value. A variable also has an associated lvalue. The "l" in lvalue can be though of as location, meaning that a variable has a location that data or information can be put into. This is contrasted with a constant. A constant has some data value, that is an rvalue. But, it cannot be written to. It does not have an lvalue.

  Another view of these terms is that objects with an rvalue, namely a variable or a constant can appear on the right hand side of a statement. They have some data value that can be manipulated. Only objects with an lvalue, such as variable, can appear on the left hand side of a statement. An object must be addressable to store a value.

  Here are two examples.

int x;
x = 5; // This is fine, 5 is an rvalue, x can be an lvalue.
5 = x; // This is illegal. A literal constant such as 5 is not
    // addressable. It cannot be a lvalue.

  这段就说的很明白 lvalue中的l其实指的表示该值的存储地址属性,而另外一个相对的词rvalue值中的r指得是read的属性,和左右根本没有任何关系。金山词霸的解释真是狗屎啊。

  作者的英文也是臭的可以, 自己没有理解好原文, 自以为是, 就咬定这个错, 那个错了!

  引文中说: "The "r" in rvalue can be thought of as "read" value."

  就是你可以把 "r" 理解为 "read". 并没有说就是 "read" 的意思!

  其实, lvalue, rvalue 原来是怎么说的, 恐怕也无从考证了. 不过, 称为"左值", "右值" 并没有违背原意. 因为, 到目前为止, 所有计算机语言都是将被赋值量置于赋值号左端的, 因此这种称谓和理解非常直观的. 对于赋值量来说, 也是相同的道理.

  之所以有"location"和"read"的说法, 是因为在C/C++中, 有很多表达式是表达可赋值单元的, 我们不能简单地理解"lvalue"就是变量. 如: a, *p, *(a->p+1), 等等. 这些都是C/C++的表达式, 不是变量, 故用"location"的含义可以避免很多误解. 作者举的例子:

  5 = x;

  许多人一看都能明白, 但却不是问题的本质! 请看下面的例子:

 const int x;
  x = 1;  // 这里 x 是 rvalue! 所以, 这是错误的赋值!
  struct fun {
   int a;
   int& operator()() { return a; }
   int& operator+(const fun& f) { return a+=f.a; }
   int operator-(const fun& f) { return a-f.a; }
  };
  fun f, g1, g2;
  f() = 1;  // 这里 f() 是 lvalue! 所以, 这个赋值是正确的!
  g1 + g2 = 1;// 这里 g1+g2 是 lvalue! 所以, 这个赋值是正确的!
  g1 - g2 = 1;// 这里 g1-g2 是 rvalue! 所以, 这个赋值是错误的!

  能够理解这样例子的同好, 显然不难看出, lvalue 是叫"左值"(即: l 理解为 left)还是叫什么别的(如: l 理解成location)根本就不是原则性的问题! 毕竟, 在计算机程序设计语言中, location 都是左置的!

  至于, rvalue, 只不过是相对于 lvalue 而叫"右值"而已, 也并没有什么大不了的! 作者这么咬文嚼字, 恐怕也会令 lvalue, rvalue 的首用者看了会啼笑皆非吧!

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明