C语言---“前++和后++的区别”
(2014-09-18 14:12:07)分类: 《C与指针》学习笔记 |
左值表示可以位于赋值符(=)左边或者右边的变量,它代表着一个可以用来存储数据的内存空间;而右值只能位于赋值符右边,因为它被没有对应的一个内存空间。
例如:
int a=1;
int b=a;
第一个语句中a是左值,1是右值。在第二个语句中a作为右值给另一个变量赋值。但是常量1不能作为左值,例如语句“1=a;”是非法的。
延伸:对比(++a)和(a++)
int a=0;
++a=1;//合法语句,因为++a对应a变量的内存空间
a++=2;//非法语句,因为a++只是a变量的一个值的拷贝,不对应a的内存空间
在C语言中,前缀自增(++a)和后缀自增(a++)操作符并不是同一个操作符,前缀自增操作符的优先级高于后缀自增,同时得到的结果并不完全一致,因此需要区分。这样的结果是由编译器所决定的,虽然不同的编译器可以指定一套属于自己的标准,但这样的编译器有可能并不符合统一的规范,造成程序无法移植到到使用其他编译器的机器上运行。因此大多数编译器遵从一定的标准规范,例如ANSI C标准。所以大部分语句的合法性在大部分编译器上都通用,而未在标准内的其他情况需要单独考虑。例如:“c + --c;”这条语句的执行顺序就不在标准中,移植时需要考虑编译器的情况。
例子:
int a=0,b=0;
a+++++b;//非法语句,++操作符优先级高于+,所以先进行a++,然后(a++)++,由于(a++)是一个右值,不能进行自增操作,就想无法进行2++一样,所以语句非法。
a+++(++b);//合法