C和指针 5.3 左值和右值

缘起

《C和指针》 5.3节

分析

简单讲,左值(L-Value)就是可以出现在=左边的,右值(R-Value)就是可以出现在=右边的.

下面我们来看例子

1
2
3
int a = 1, b = 2;

a=b+25

是可以的. 但是下面的可以吗?

1
2
3
int a = 1, b = 2;

b+25=a;

显然不行, 报错

1
error C2106: '=' : left operand must be l-value

意思很明显——=的左边必须要是一个合法的左值.

听上去貌似是这样的表达式不能作为左值,而变量可以作为左值. 真的是这样吗?

1
2
int a[30],b=1;
a[b+10] = 26;

左边是下标引用操作符哦,左边是一个表达式哦~ 但是左边依旧是一个合法的左值。

再看一个例子

1
2
3
int a, *p;
p = &a;
*p = 20;

*p 也是一个表达式, 但是它也是一个合法的左值.

好了,看完了例子,我们来总结一下能作为左值的本质是什么? 就在于左边的内存空间我们程序能不能访问, 能访问就是合法的左值,反之就不是合法的左值

b+25 在程序运行期间肯定会被计算,结果一定会存放在机器的某个地方,但是程序员并没有办法预测结果会存储在什么地方,也无法保证下一次它会存储在什么地方. 所以他不是一个合法的左值.

但是其余两个都是可以知道并且访问的内存地址. 所以是合法的左值.

最后总结:

左值表示一个内存中的一个地址,右值表示一个值,左值总是右值,反之不然.