新手喜闻乐见的x++,y++,++x,++y

               关于x++,y++,++x,++y到底在程序中是怎么运行的


 首先明白一点,++、--这些符号叫做操作符,操作符本质上是一种特殊的函数。打个比方,假如C语言并没有定义操作符这么个东西,而是用函数代替,那么语句x=y+z;很有可能会被替换成等价的函数int addition(int x,int y,int z)//打个比喻,也就是说你要addition(x,y,z);才能计算x=y+z,太不方便了。
先来看看以下代码:
int x=3;
int y=4;
++x=++y;
那么执行完上面三行代码,x和y的值最终是多少呢?
先不说答案,来分析一下:
++x=++y;假如你遇到这么个东西,你会怎么做,没错,你会把它拆开为三部分: ++x = ++y;然后计算右边的值,再把右边的值赋值给左边的。
同样的道理放在程序上,程序根据操作符的优先级来拆分语句,语句中优先级最高的是++,然后是=,所以执行的顺序是,先计算++x,然后计算++y,再把++y的值赋值给++x,++x和y++执行完之后y的值都会自增1,只是++y是先自增,后使用,而y++是先使用,后自增。从逻辑上来说,相当于y=y+1;所以++y的值为5,++x的值为4,然后把y再赋值给x,所以x和y都等于5。

那假如执行的是x++=y++;呢,从逻辑上来说,你是想把y的值赋值给x++,然后y自增1。
那么问题来了,x++返回的值是什么呢,y的值是赋值给了自增前的x,还是自增后的x呢?
编译器给出的答案是 [Error] lvalue required as left operand of assignment//错误 左值应为左操作数
什么是左值,什么是右值?
左值:左值可以出现在赋值语句的左边或右边
右值:右值只能出现在赋值的右边,不能出现在赋值语句的左边。
简单来说,int a;a是左值,因为a在内存中占据空间,但a+5就不是了,a+5表示的是一个数值,它在内存中就没有占据空间,程序并没有专门为a+5开辟内存去存放,它仅仅是个数值,是不能被赋值的,就像你不能把4赋值为3。
那么x++返回的是什么呢,显然是自增前的x,但它返回的是自增前的数值,并不是一个变量,也就是说,在x++自增的过程中,存放x的变量的内存由此自终只有一处,而x++返回的不是x变量本身,而是x的值,你能给变量赋值,但不能给值赋值。
上面的++x=++y;可以成功运行,显然++x返回的是x变量本身。

综上,x++和++x不同之处重点在于两处:
1、x++是先使用,后自增,++x是先自增,后使用。
2、x++返回的是x自增前的值,是x对象的值,而++x返回的是x自增后x对象本身。



猜你喜欢

转载自blog.csdn.net/fordreamyue/article/details/73322083