初始化 / 变量 / 右值 / 左值 / 编程语言 · 2023年 10月 10日 0

左值和右值

136 次浏览

计算机硬件结构存在取数据和存数据,取数据是从一个地址读,存数据是向一个地址写。一般而言,有地址能被写的就在赋值表达式的左侧,被称为左值(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++那么复杂,比较单纯,不再赘述。

常量和表达式

  • 常量一般是被编译器放进寄存器或者汇编指令中常量部分,没内存地址概念。
  • 表达式计算结果完全随着编译器而定,不能指代确定的内存地址。