博主资料

留言 加为好友 收藏

用户名:  nathanxu

个人统计

用户名: nathanxu
等级: 初来乍到
威望: 225
积分: 373
在线时间: 4 小时
日志总数: 24
评论数量: 83
访问次数: 91744
建立时间: 2006-02-26
RSS订阅       手机访问

最新评论

文章搜索

文章列表

友情链接

最近访问的人:

函数库的功能
2008-08-04 10:24:30
您有2条短消息
2008-07-10 01:25:23
jtclas
2008-06-03 17:34:21
迷尔
2008-05-06 13:13:30
FANS
2008-04-11 03:11:03
梦想IT
2008-03-29 19:12:31
黄昏
2008-03-28 20:02:46
松树叶
2008-03-02 19:08:33
霜之哀伤
2008-02-16 15:53:23
blueliuv
2007-12-29 17:01:54

日志文章

2006年04月18日 11:34:00

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

在看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的属性,和左右根本没有任何关系。金山词霸的解释真是狗屎啊。

类别: Linux开发 |  评论(22) |  浏览(6651) |  收藏
一共有 22 条评论
22楼 [匿名]wendaofeng 2008年05月01日 10:18:20 Says:
长见识了,:-)。
21楼 [匿名]汗 2008年03月04日 14:52:48 Says:
楼主的解释确实臭的可以啊
20楼 [匿名]还是 2008年01月31日 22:24:33 Says:
做我师傅吧 我QQ402119295
19楼 [匿名]guest 2008年01月25日 09:15:48 Says:
楼主傻啊
本来就是左值右值
你懂不懂英语
人家意思是“你可以把它理解成……”
金山再弱也比你强多了吧
18楼 [匿名]chuiao 2007年12月15日 21:18:11 Says:
我很想学C/C++,可是我的英语很差,可以学吗?
17楼 [匿名]frank 2007年12月04日 01:46:45 Says:
至少在《c++ primer》里,作者解释l、r也是取的左右的意思。。。

英文版第4版 p.45
16楼 [匿名]guest 2006年09月22日 14:05:41 Says:
C++好难啊
15楼 [楼主]Nathan的技术空间 2006年09月10日 22:28:15 Says:
这位朋友开门骂人实在无益, 我也不想删你的评论。在这里也只是大家探讨,我并不认为自己的问题有多少问题,同时也不认为你有多少高明。 感觉你倒是一个顽固的学院派的卫道者,在这里大吊书袋,却没有实际意义。 貌似你很堂皇的指出了我的问题,实际却在误导着更多的人,试问几位看客有几人能看明白你的左值右值之说,而且你的解释无非是说左值右值也是可行的说法,但是这种皮像肉不像的解释实在让人作呕,除了摆出一副所谓学者的姿态,其实细究之下真可谓欺世盗名之辈, 实为不耻
14楼 [匿名]guest 2006年08月11日 06:07:33 Says:
作者的英文也是臭的可以, 自己没有理解好原文, 自以为是, 就咬定这个错, 那个错了!
引文中说: "The "r" in rvalue can be thought of as "read" value."
就是你可以把 "r" 理解为 "read". 并没有说就是 "read" 的意思!
其实, lvalue, rvalue 原来是怎么说的, 恐怕也无从考证了. 不过, 称为"左值", "右值" 并没有违背原意. 因为, 到目前为止, 所有计算机语言都是将被赋值量置于赋值号左端的, 因此这种称谓和理解非常直观的. 对于赋值量来说, 也是相同的道理.
之所以有"location"和"read"的说法, 是因为在C/C++中, 有很多表达式是表达可赋值单元的, 我们不能简单地理解"lvalue"就是变量. 如: a[j], *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 的首用者看了会啼笑皆非吧!
13楼 [匿名]guest 2006年08月11日 06:01:47 Says:
作者的英文也是臭的可以, 自己没有理解好原文, 自以为是, 就咬定这个错, 那个错了!
引文中说: "The "r" in rvalue can be thought of as "read" value."
就是你可以把 "r" 理解为 "read". 并没有说就是 "read" 的意思!
其实, lvalue, rvalue 原来是怎么说的, 恐怕也无从考证了. 不过, 称为"左值", "右值" 并没有违背原意. 因为, 到目前为止, 所有计算机语言都是将被赋值量置于赋值号左端的, 因此这种称谓和理解非常直观的. 对于赋值量来说, 也是相同的道理.
之所以有"location"和"read"的说法, 是因为在C/C++中, 有很多表达式是表达可赋值单元的, 我们不能简单地理解"lvalue"就是变量. 如: a[i], *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 的首用者看了会啼笑皆非吧!
12楼 [匿名]guest 2006年07月20日 15:25:54 Says:
到地怎样才能学
11楼 [匿名]guest 2006年07月08日 09:44:18 Says:
kdfsg;kdf
10楼 [匿名]guest 2006年07月08日 09:44:16 Says:
kdfsg;kdf
9楼 [匿名]guest 2006年06月28日 21:37:36 Says:
学C和C++的时候,没见到这个概念,今天见了读了全文,rvalue和lvallue,我的理解就是我们学C和C++的时候说的变量和值的关系,
即:lvalue用来装rvalue
8楼 [匿名]guest 2006年06月24日 00:28:36 Says:
lvalue叫做左值也是有一定道理的,因为它是在等号左边。它是可以被赋值的变量。rvalue则相反。
7楼 [匿名]guest 2006年06月12日 08:18:04 Says:
学会c语言学c++是简单了吗?
6楼 [匿名]guest 2006年06月04日 16:02:15 Says:
金山词霸大概只是按自己的想法解释的,并不一定每个人都能把每一个词解释得很清楚.话说回来金山词霸解释成这样确实过不去.
5楼 [匿名]guest 2006年04月26日 16:19:50 Says:
我们课本上的观点不是上面那段的第2种观点吗
4楼 [匿名]guest 2006年04月26日 09:08:28 Says:
不错,原来我们从课本上学的是误的。
我感觉这个应该是我们老一辈的翻译家的翻译问题。
看来做学问真是要有刨根问底的精神啊!
3楼 [匿名]guest 2006年04月24日 16:20:11 Says:
你也太难为金山了:)
oneday
« 1 2» Pages: ( 1/2 total )
发表评论