手撕指针第四章 | 引用
手撕指针第四章 | 引用
左值 & 右值
为了能更清楚的解释指针,我们还需要了解左值(L-value)和右值(R-value)。这两个术语是多年前由编译器设计者所创造并沿用至今的,尽管它们的定义并不与 C 语言严格吻合。
左值就是那些可以出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西。
1
a = b + 25;
a 是个左值,b + 25 是个右值。
他们可以互换吗?原先用作左值的 a 可以当作右值,然而 b + 25 却不能当作左值,因为他并未标识一个特定的位置。因此,这条赋值语句是非法的。
当计算机计算
b + 25时,它的结果必然保存在机器的某个地方。但是,程序员并没有办法预测该结果会存在什么地方,也无法保证这个表达式的值下次还会存储在同一个地方,所以,这个表达式不是一个左值。基于同样的理由,字面值常量也都不是左值。
我们似乎可以得出这样一个结论:变量可以作为左值而表达式不可以。但是这个结论并不准确。如下赋值语句的左值就是表达式。
1
2
3
4
5
6
int a[30];
a[b + 10] = 0;
int *p;
p = &a;
*p = 10;
This post is licensed under CC BY 4.0 by the author.