class Test{ public static void main(String[] args){ int a = 10; for(int i=0;i<10;i++){ a=a++; } System.out.println(a); } }
上面输出的结果还是10,求具体代码实现原因。
class Test{ public static void main(String[] args){ int a = 10; for(int i=0;i<10;i++){ a=a++; } System.out.println(a); } }
上面输出的结果还是10,求具体代码实现原因。
这个问题只凭想象很难理解,看看字节码怎么执行就能明白了,通过javap命令得到字节码如下:
public static void main(java.lang.String[]);
Code:
0: bipush 10 //将10推到栈顶
2: istore_1 //将栈顶int型数值存入第二个本地变量
3: iconst_0 //将int型0推送至栈顶
4: istore_2 //将栈顶int型数值存入第三个本地变量
5: goto 16 //跳转
8: iload_1 //将第二个int型本地变量推送至栈顶
9: iinc 1, 1 //将指定int型变量增加指定值(i++, i--, i+=2)
12: istore_1 //将栈顶int型数值存入第二个本地变量
13: iinc 2, 1 //将指定int型变量增加指定值(i++, i--, i+=2)
16: iload_2 //将第三个int型本地变量推送至栈顶
17: bipush 10 //将10推到栈顶
19: if_icmplt 8 //比较栈顶两int型数值大小,当结果小于0时跳转
22: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
25: iload_1
26: invokevirtual #22; //Method java/io/PrintStream.println:(I)V
29: return
上面我已经添加注释了,其中“a=a++;”这句对应的字节码为:
8: iload_1 //将第二个int型本地变量(a=10)推送至栈顶 ,此时栈顶值为10
9: iinc 1, 1 //将指定int型变量增加指定值(此时a=11),但此时栈顶值不 变,还是10
12: istore_1 //将栈顶int型数值(10)存入第二个本地变量(a=10)
最终a获取栈顶值10