左值和右值
计算机硬件结构存在取数据和存数据,取数据是从一个地址读,存数据是向一个地址写。一般而言,有地址能被写的就在赋值表达式的左侧,被称为左值(l-value), 其它的被称为右值(r-value). 大部分编程语言都有左值和右值的概念。C++的左值和右值概念是最复杂的。
- 汇编代码中一般用中括号或小括号包裹变量代表访问内存地址,可向里面写入代表左值。
- C++11右值扩展成纯右值和将亡值,右值都可以移动,二者区别是将亡值是有身份的。
- 右值引用更有意思,C++11增加它可以将右值的生命周期拉长,对于延续返回的局部变量生命期有奇效。
- C++同时有左值引用和右值引用,C++11引入了万能引用。
- C++提供is_lvalue_reference和is_rvalue_reference判断变量是左值还是右值引用。
- 其他编程语言,像Java/C#/Python/Rust/Go/JS/PHP等左值和右值思想没有C++那么复杂,比较单纯,不再赘述。
常量和表达式
- 常量一般是被编译器放进寄存器或者汇编指令中常量部分,没内存地址概念。
- 表达式计算结果完全随着编译器而定,不能指代确定的内存地址。
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!