i++

先看这么一段代码:

 

 本来以为都会输出2,结果第一个输出是1,这是为啥呢?

 

还得先看下边这种情况:

 

 

 

 下边的输出也是1,先看一下字节码:

 

 

 

 流程大致如下:

 把0压入栈顶->0弹出赋值给i->0再压入栈顶->局部变量i+1,现在局部变量里的i是1了->0弹出赋值给i(这个时候i的值又被修改了)

所以最后输出i的时候还是原来的值,其实就是多了一步而已,所以在这里i++就是给局部变量+1的过程,而i=i+1是把栈顶元素重新赋值的过程,所以打印出来的i是不对的。

然后看一下第一种情况:

 可以看到,虽然把i放进方法区,而且并没有给i++赋值,但是还是大同小异:

当输出i++这个整体的时候还是被重新赋值了,但是被赋值的这个变量在main方法的局部变量表中不可见,因为没定义,但是因为i是静态变量,i++这个操作还是成功的

因此在打印静态变量的值会发现i的值正确了。

其实就是注意i++的操作在这里可以理解为是发生在局部变量表中的(其实在这里是4步:入栈,出栈赋值,+1操作,赋值),而i=这个操作是栈顶元素赋值的操作,两者独立。

结论:i++后已经是赋值完成了,i=i+1,是把栈顶元素重新赋值了一遍。

posted @ 2020-05-08 16:02  ~笑春风~  阅读(837)  评论(0编辑  收藏  举报