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 个回复

正序浏览
能想这么多很不错
回复 使用道具 举报
++永远都是坑
回复 使用道具 举报
不错不错,学习了
回复 使用道具 举报
先赋值在自增呀
回复 使用道具 举报
i = i++;是先赋值后自增。

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

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