[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

本文详细探讨了C++中的左值(lvalue)、右值(rvalue)的概念,包括左值和右值的不同类型,如xvalue、glvalue和prvalue,并通过实例解释了它们在C++11中std::move的应用。了解这些概念对于理解C++中的资源管理和移动语义至关重要。


参考:
1. http://en.cppreference.com/w/cpp/language/value_category
   << Value categories >> 
2. https://msdn.microsoft.com/en-us/library/dd293668.aspx
   << Rvalue Reference Declarator: && >>
3. https://msdn.microsoft.com/en-us/library/f90831hc.aspx
   << Lvalues and Rvalues (Visual C++) >> 
4. << Working Draft, Standard for Programming Language C ++ >> [Document Number: N3797] 
   3.10 Lvalues and rvalues 
5. http://en.cppreference.com/w/cpp/utility/move
   << std::move >>




场景:
1. C++11 引入了std::move,它可以高效率的从一个左值资源移动到另一个左值资源里,这个过程不需要再创建新的资源. 这对std:

在C语言中,**左值lvalue)**和**rvalue)**是表达式分类的重要概念,它们决定了一个表达式是否可以出现在赋操作的左侧或只能用于计算--- ## 一、左值lvalue) ### 定义: 左值是指**具有内存地址、可以被取地址**的表达式,通常表示一个变量或内存对象,可以被修改。 ### 特点: - 可以出现在赋操作的左侧。 - 可以使用 `&` 运算符取地址。 ### 示例: ```c int a = 10; a = 20; // 正确:a 是左值 int *p = &a; // 正确:a 是左值,可以取地址 ``` --- ## 二、rvalue) ### 定义: 是指**没有内存地址、能被取地址**的表达式,通常表示一个临时的或字面量。 ### 特点: - 只能出现在赋操作的侧。 - 能使用 `&` 运算符取地址。 ### 示例: ```c int b = 5 + 3; // 5 + 3 是,只能用于赋侧 int c = 10; int d = c + 1; // c + 1 是 int *p = &(c + 1); // 错误:能取地址 ``` --- ## 三、左值 vs 对比 | 特性 | 左值lvalue) | rvalue) | |------------------|----------------------------|-----------------------------| | 是否可取地址 | ✅ 是 | ❌ 否 | | 是否可出现在 `=` 左侧 | ✅ 是 | ❌ 否 | | 是否是临时 | ❌ 否 | ✅ 是 | | 示例 | 变量、数组元素、解引用指针 | 字面量、表达式结果、函数返回 | --- ## 四、左值在函数返回中的表现 ### 示例: ```c int get_value() { return 42; } int main() { get_value() = 100; // 错误:get_value() 返回的是能赋 return 0; } ``` 修复方法: ```c int value = get_value(); value = 100; // 正确:value 是左值 ``` --- ## 五、结构体和左值/ ### 示例: ```c typedef struct { int x; int y; } Point; Point make_point() { Point p = {1, 2}; return p; } int main() { make_point().x = 10; // 错误:make_point() 返回的是 return 0; } ``` 修复方法: ```c Point p = make_point(); p.x = 10; // 正确:p 是左值 ``` --- ## 六、特殊左值可修改的左值(non-modifiable lvalue) 某些左值虽然可以取地址,但**能被修改**,比如 `const` 变量: ```c const int x = 10; x = 20; // 错误:x 是可修改的左值 ``` --- ## 七、总结 - **左值**:可以取地址、可被赋、表示内存中的对象。 - ****:可取地址、仅用于计算可被赋- 函数返回、表达式结果通常是- `const` 变量是左值可修改。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行峰 (花名)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值