C和C++里面的lvalue和rvalue的释义[VC/C++编程]
本文“C和C++里面的lvalue和rvalue的释义[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在看GCC的文档的时刻,看到一个词lvalue,查了金山词霸其释义为 lvalue [计] 左值.因为的确在介绍编译原理的课程入耳过这个词,大致知道其意思就没有多想.但是看完GCC文档的这个篇幅,都无法懂得全篇在说什么.问题还是出在了lvalue这个词的“左值”是什么意思的理解上了.再找M-W字典,却奉告没有这个词.于是谷歌了一把,的确很多地方都称其为左值,我仍旧不得方法.最后在一个百科网站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 的首用者看了会啼笑皆非吧!
以上是“C和C++里面的lvalue和rvalue的释义[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |