资讯详情

c语言和c++里面的左值、右值

📅 2026/10/27 18:59:24 | 华诺云谱 👁 阅读
c语言和c++里面的左值、右值
可以记C 里面有左值概念但“右值体系”是 C 为了对象生命周期和移动语义扩展出来的。简单说C 语言里面有“左值lvalue”这个概念但没有 C 那么完整的“左值/右值体系”。C 的左值、右值概念是从 C 继承来的但后来扩展得非常复杂尤其是为了支持移动语义move semantics和右值引用。1. C 语言里的左值lvalueC 语言标准里有 lvalue。简单理解左值表示一个有存储位置地址的对象可以出现在赋值号左边。例如inta10;a20;这里a是左值20是常量不是左值因为a可以取得地址printf(%p,a);说明a有内存位置。再比如intarr[10];arr[3]100;arr[3]是左值。因为它代表数组中的一个真实内存位置。2. C 里面有没有右值rvalue严格来说C 标准没有正式定义 rvalue 这个术语。但是 C 程序员通常会这样理解不能作为左值使用的表达式就是“右值”。例如inta;a12;这里12产生一个临时结果没有独立存储位置。所以通常称为右值例如intx;xx1;右边x 1是一个计算结果。它没有地址(x1)// 错误所以不是左值。3. C 和 C 最大区别C大概只有左值 | -- 非左值通常叫右值例如inta;a5;a 左值 5 非左值 a5 非左值C后来发展成表达式类别 expression | -------------------- | | glvalue rvalue | | -------- ---------- | | | | lvalue xvalue prvalue也就是左值 纯右值 将亡值4. 为什么 C 要搞这么复杂主要为了std::move()和移动构造。例如std::string ahello;std::string ba;复制a | 复制数据 | b比较慢。C11std::string bstd::move(a);告诉编译器a 不需要保留了可以把内部资源直接搬走。这需要区分还有用的对象lvalue可以被移动的临时对象xvalue5. 一个 C/C 对比例子Cinta10;int*pa;可以a | 地址所以a 是左值Cinta10;intb20;这里20是纯右值prvalue但是std::move(a)得到xvalue将亡值它有地址但是允许被移动。6. 一个容易混淆的地方很多人认为左值就是变量右值就是常量这个在 C 里大致有用但不完全正确。例如inta;(a)10;(a)仍然是左值。再比如intarr[5];arr[0]不是变量名但也是左值。因为它代表一个对象。总结CC左值有有右值没有正式分类有严格定义xvalue没有有右值引用没有有移动语义没有有所以可以记C 里面有左值概念但“右值体系”是 C 为了对象生命周期和移动语义扩展出来的。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑