A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

假设 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永远是原值。

17 个回复

倒序浏览
这速度也太快了吧
回复 使用道具 举报
marcojam 来自手机 中级黑马 2015-9-1 00:29:26
藤椅
学习了,楼主厉害!
回复 使用道具 举报
自己顶顶顶 顺带刷分
回复 使用道具 举报
分分分                                    
回复 使用道具 举报
说了这么多,其实就是先赋值在自增
回复 使用道具 举报
顶一下
回复 使用道具 举报
顶顶顶,一起顶
回复 使用道具 举报
XXXXXXXXXXXXXXXXXXXXXXXX
回复 使用道具 举报
cat73 黑马帝 2015-9-1 07:21:45
10#
i++的返回值是1 于是将1给i 这有什么疑问么
等于号会将右边所有东西都计算完毕之后,最终才执行赋值。
所以说,右边的表达式 也就是i++ 计算完毕的结果是1,所以i会被赋值为1
回复 使用道具 举报
先自增在赋值 没疑问把
回复 使用道具 举报
cc3441251 来自手机 中级黑马 2015-9-1 08:38:15
12#
差不多懂了
回复 使用道具 举报
i = i++;是先赋值后自增。

其实你可以这样理解,自增运算符在数字后面的时候,先遮住自增运算符,这样就剩下了i = i,这样就可以自然地理解成先赋值,然后再自增运算。

如果是 i = ++i;那就先遮住运算符后面的i,就可以理解为先自增运算,然后再将运算结果赋值给i。
回复 使用道具 举报
先赋值在自增呀
回复 使用道具 举报
不错不错,学习了
回复 使用道具 举报
++永远都是坑
回复 使用道具 举报
能想这么多很不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马