左值与右值?
左值(L-value)
与右值(R-value)
,二者之间的区别是什么?
左值与右值
01
这两个术语是多年前由编译器设计者所创造并沿用至今的,尽管它们的定义并不与C语言严格吻合。
02
左值就是那些可以出现在赋值符号左边的东西;右值就是那些可以出现在赋值符号右边的东西。
这样的解释有些脱下裤子放屁的意思,通过名称我们也能得出左值和右值的意思,那么应该出现在赋值符号左边的东西是什么呢?
03
1. a = b + 1;
2. b + 1 = a;
在语句1中,a是一个左值,因为它标识了一个可以存储结果值的地点;b + 1是个右值,因为它指定了一个值。
那么,能像语句2一样,互换左右值的位置吗?
原先用作左值的a此时也可以作为右值,因为每个位置都包含一个值。然而,b + 1无法作为一个左值,因为它并未标识一个特定的位置。因此,语句2是非法的。
04
int a = 5;
++(a++);
如果尝试执行此段代码,则会出现如下报错
main.c:4:2: error: expression is not assignable
++(a++);
^ ~~~~~
1 error generated.
报错的意思为: 表达式不可赋值
将++(a++)
拆解,++(a = a + 1)
-> ++(5)
-> 5 = 5 + 1
。拆解之后,很容易就能发现问题所在。5是一个常量,它无法被赋值为6。
05 左值与右值
左值: 是指用于识别或定位的一个标识符,同时左值还必须是可以被改变的
右值: 任何可以被读取的值都是右值(非左值)