首先看下i=i++的字节码:
iconst_0:表示生成一个常量0,放入操作数栈
istore_1:表示将操作数栈顶元素存入局部变量表1号位置。
iload_1:表示将局部表1号位置的变量值,压入操作数栈
iinc:自增1
图中应该是int i =0(勘误),并且省略了局部变量表0号位置。
所以最终的原因在于:
赋值操作导致操作数栈中的值,覆盖了原本已经自增的局部变量。
这也是大家所说的中间变量缓存机制。
所以大家可以好好回味一下,x++:先运算,再自增,这句话的含义了。
先运算,表示先将x压入操作数栈,参与下一次使用到此变量的运算。
而离谱的是,赋值操作的优先级低于自增运算符,所以在自增操作完成后,变量才被赋值。
结果上看,似乎是先自增,后运算。
所以可以理解为变量为就绪态,先运算表示先将变量变为就绪态,并不是表示运算一定在自增前面。
以上只是一点小思考,大家不要真的以为变量有就绪态,而且“先运算,后自增”本身似乎也没有原文支撑,只是大家的总结,所以大家还是要以事实为依据,自己去探寻真理。
附上反编译字节码命令:
javap -v xxx.class