Loading... # 前言 在学习C++的过程中,我一直对左值(lvalue)和右值(rvalue)的概念模糊不清,所以有了这篇文章。 # 左值和右值的定义 在C++中,左值它是指向一个内存地址的,右值是则没有指向任何内存地址。这就造成了右值是短暂和短命的。而左值则能活很久,因为它是以变量(variable)的形式存在的。可以把左值看作一个容器(container),而右值是容器里面的事物。容器消失了,里面的事物就会消失。 ```cpp int a = 60; //a是左值,60则是右值 ``` 在这里,<kbd>60</kbd>是一个右值,一个数字(字面常量(literal constant))它没有指定的内存地址,在程序运行时它储存在临时的寄存器外,在该例中,<kbd>60</kbd>被赋予(assign)给<kbd>a</kbd>,<kbd>a</kbd>是一个变量,一个变量(specific)有着具体的**内存位置**,所以它是一个左值。C++中声明赋值(assignment)需要一个左值作为它的左操作数(left operand);这完全合法的。 对于左值<kbd>a</kbd>,你可以做这样的操作: ```cpp int* b = &a; //ok ``` 在这里我通过地址操作符<kbd>&</kbd>获取了<kbd>a</kbd>的内存地址并且把它放进<kbd>b</kbd>,<kbd>&</kbd>操作符需要一个左值且产生一个右值,这也是完全合法的操作,在赋值操作符左边我们有一个左值,在右边我们使用取址操作符产生右值。 然而,我们不能这样写: ```cpp int y; 60 = y; //error ``` 上面的错误显而易见,但从技术上来说<kbd>60</kbd>是一个字面常量也就是一个右值,它没有一个**具体的内存地址(memory location)**,所以它会把<kbd>y</kbd>分配到一个不存在的地方。导致程序错误。 下面是GCC给出的变异错误提示: `error: lvalue required as left operand of assignment` 赋值的左操作符需要一个左值,这里我们使用了一个右值<kbd>60</kbd> 我们也不能这样做: ```cpp int* a = &60; //error ``` GCC给出了以下错误提示: `error: lvalue required as unary '&' operand`\` <kbd>&</kbd>操作符需要一个左值,因为右值它没有**具体的内存地址**,在进行取址操作时,会发生取不到地址的错误。 # 返回左值和右值的函数 待更新 <center>Sources</center> 参考博客 internalpoiners <a href="https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c" target="opentype">==点击==</a> 最后修改:2024 年 03 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝 赞 如果觉得我的文章对你有用,请随意赞赏