先看这么一段代码:
本来以为都会输出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,是把栈顶元素重新赋值了一遍。