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的属性,和阁下基础没有任何关系。金山词霸的表明真是狗屎啊。
作者的英文也是臭的可以, 本身没有领略好原文, 自觉得是, 就咬定这个错, 谁人错了!
引文中说: "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 的首用者看了会哭笑不得吧!