很多Bug根源,只因为分不清左值、右值。
1. 一句话区分
- 左值:拥有独立内存地址,能放东西、可取地址(变量、数组元素)
- 右值:临时数值,无内存、用完消失(字面量、表达式结果)
int a;
a = 10; // a左值(可赋值),10右值(纯数据)
&a; // 左值可取地址
&(a+1); // 报错!a+1是临时右值,没有地址
2. 高频暗坑:前后自增不同命
++a; // 左值:本体更新,有地址
a++; // 右值:返回旧临时值,无地址
// 非法:右值不能赋值
(a++) = 10;
// 合法:左值可以赋值
(++a) = 10;
3. 核心结论
指针只能指向左值;
赋值只能写给左值;
所有“不能取地址、不能赋值”的报错,全是踩了右值红线。