假设 i = 1; i=i++;
这个结果 i 的值是 1.为什么呢?不应该是2吗?
大家看到这个语句i = i++肯定想到的是先赋值再自增,大家以前这样分析也没有错误,但其实这里有个问题。
大家知道++的优先级要高于赋值=,但Java还要保证这里要先赋值再自增(因为++在后面),那是要先执行++,还是先执行赋值呢?
大家以前之所以套用先赋值后自增,没有错误,其实是因为i++并没有将值赋给自身,而是赋给了其他变量,比如a = i++。这样先赋值 后自增就完全说得通,最后a打印出来也就是2,。
但赋给自身就不一样了。
大家想,既然++在后面,那就先赋值,把自增前的1赋给i,然后i再自增,这样再次打印i的时候,i就应该是2,可是结果却大出意料,竟然是1。
其实Java运行机制并不是简单的先赋值再自增。他会首先执行i++自增操作,但是会先在内存中开辟一个临时空间,存放i的值,然后i自增,之后再从临时空间拿出来i,赋给i,所以结果是1。
不知看到这,大家理解了没有,其实不存在先赋值再自增,而是先自增,但是为了保证Java的规则(++在后,先赋值再自增),所以开辟了临时空间,暂时存储了原值,并在i自增后,又将原值赋给了i,将本来已经是2的i,又赋回了1。
既然不是真正的先赋值后自增,赋值后,自然也就没有了自增操作(因为之前已经自增过了,只不过又被赋值成了原值),结果i只能成为1。
如果你在for循环中最后的控制条件,写成了i=i++,那么恭喜,你的循环成了死循环。因为i永远是原值。
|
|