快速业务通道

C和C++里面的lvalue和rvalue的释义

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

在看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 的首用者看了会啼笑皆非吧!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号