左值与右值

什么是左值?什么是右值?
从字面上说所谓的左值就是能在赋值符号的左边出现的数值,右值就是可以在赋值符号右边出现的数值。
其实际意义也是如此,那么哪些值可以在赋值符号左边出现,哪些可以在等号赋值符号出现的呢?
这就要从分析赋值符号左边与右边出现的值的区别着手。能被赋值的数,一定在内存里面占用有一块内存空间,并且这块空间的内容可以改变,用以存储赋予的数值。而在赋值符号右边出现的数则无此要求,因为赋值符号右边的数被赋值给赋值符号左边的数,仅仅涉及到数值,也就不涉及内存的改变。
我们来看两条语句:

k = i + 3;
i + 3 = k;

这两条语句有什么区别呢?从表面看仅仅只是顺序相反而已。我们拿到vs2015中编译一下,看看有什么结果:
这里写图片描述
可以看见,第一条语句可以通过编译,是合法的,但是第二条语句则报错说明赋值符号左边的内容不能作为左值,我们单独来看第一条语句的汇编代码:
这里写图片描述
可以看见,第一条语句底层分为三条指令:前两条语句完成赋值符号右边的加法操作,将结果存在一个临时的位置(这里是寄存器eax),最后将值赋给变量K所在的内存中。
我们再来看第二条语句,同样的执行i+3会将所得到的值先存在一个临时的内存位置,而赋值符号赋值的对象则是左边等式最终指向的地址空间,在这里,这个地址空间是不确定的,因此第二条语句是违反语法的,不能通过编译。
我们来总结一下左值与右值:
左值:在内存中有独立的内存空间,并且这块空间的内容是可变得,也就是通常所说的变量。
右值:基本所有有值的、可赋值的数都可作为右值,通常为常量(符号常量与const常量等)与变量。

### C++ 中左值的概念及区别 在 C++ 中,左值(lvalue)(rvalue)是表达式分类的重要概念。左值是指具有持久地址的表达式,可以出现在赋语句的侧;而是指临时对象或字面量,通常不能直接用于赋侧。 #### 1. 左值(lvalue) 左值指的是具有名称并且可以在内存中找到其地址的表达式。它通常表示一个持久的对象,可以被修改或引用。例如变量名、数组元素等都是左值。 - **特性**: - 左值有持久的身份,可以在程序运行期间持续存在。 - 可以通过取地址运算符 `&` 获取左值的地址。 - 左值可以出现在赋语句的侧[^2]。 示例代码: ```cpp int x = 10; int& ref = x; // 左值引用 std::cout << "x = " << x << ", &x = " << &x << std::endl; ``` #### 2. (rvalue) 指的是临时对象或字面量,通常没有持久的身份。不能直接获取地址,也不能作为左值使用。C++11 引入了引用(rvalue reference),使得可以绑定到引用类型。 - **特性**: - 通常是临时对象或字面量。 - 无法通过取地址运算符 `&` 获取的地址。 - 可以转换为左值,但左值不能直接作为使用[^4]。 示例代码: ```cpp int&& rref = 20; // 引用 std::cout << "rref = " << rref << std::endl; // std::cout << "&rref = " << &rref << std::endl; // 错误:引用无法直接取地址 ``` #### 3. 左值的转换 当一个左值被用作需要的上下文时,会发生隐式的左值的转换。这种转换会提取左值的内容(即本身),而不是它的身份或地址[^3]。 示例代码: ```cpp int x = 5, y = 10; int z = x + y; // 隐式地将 x y 转换为进行加法操作 std::cout << "z = " << z << std::endl; ``` #### 4. 引用移动语义 C++11 引入了引用(`&&`),用于支持移动语义完美转发。引用允许绑定到,从而避免不必要的拷贝操作,提高程序性能[^1]。 示例代码: ```cpp std::vector<int> createVector() { return std::vector<int>{1, 2, 3}; } void consumeVector(std::vector<int>&& vec) { std::cout << "Vector size: " << vec.size() << std::endl; } int main() { consumeVector(createVector()); // 引用绑定到临时对象 return 0; } ``` ### 总结 - 左值具有持久身份,可以取地址并出现在赋语句的侧[^2]。 - 通常是临时对象或字面量,无法取地址[^4]。 - 左值可以通过隐式转换成为,但不能直接作为左值使用。 - C++11 的引用增强了对的支持,为移动语义提供了基础[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值