黑马程序员技术交流社区
标题:
i = i++到底是先赋值还是先自增?
[打印本页]
作者:
文景
时间:
2015-9-1 00:22
标题:
i = i++到底是先赋值还是先自增?
假设 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永远是原值。
作者:
HEY、baby
时间:
2015-9-1 00:23
这速度也太快了吧
作者:
marcojam
时间:
2015-9-1 00:29
学习了,楼主厉害!
作者:
文景
时间:
2015-9-1 00:30
自己顶顶顶 顺带刷分
作者:
别弄那些没的
时间:
2015-9-1 00:36
分分分
作者:
a6658637
时间:
2015-9-1 00:41
说了这么多,其实就是先赋值在自增
作者:
微笑的背后3
时间:
2015-9-1 00:49
顶一下
作者:
云沾衣。
时间:
2015-9-1 00:57
顶顶顶,一起顶
作者:
13009862300
时间:
2015-9-1 01:16
XXXXXXXXXXXXXXXXXXXXXXXX
作者:
cat73
时间:
2015-9-1 07:21
i++的返回值是1 于是将1给i 这有什么疑问么
等于号会将右边所有东西都计算完毕之后,最终才执行赋值。
所以说,右边的表达式 也就是i++ 计算完毕的结果是1,所以i会被赋值为1
作者:
洋葱头头
时间:
2015-9-1 07:51
先自增在赋值 没疑问把
作者:
cc3441251
时间:
2015-9-1 08:38
差不多懂了
作者:
blackpig
时间:
2015-9-1 08:46
i = i++;是先赋值后自增。
其实你可以这样理解,自增运算符在数字后面的时候,先遮住自增运算符,这样就剩下了i = i,这样就可以自然地理解成先赋值,然后再自增运算。
如果是 i = ++i;那就先遮住运算符后面的i,就可以理解为先自增运算,然后再将运算结果赋值给i。
作者:
哈哈哈欠虫
时间:
2015-9-1 13:07
先赋值在自增呀
作者:
qq840570226
时间:
2015-9-1 13:23
不错不错,学习了
作者:
王志志志
时间:
2015-9-1 15:36
++永远都是坑
作者:
陈劲松
时间:
2015-9-1 19:21
能想这么多很不错
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2