代码
public class Test{
public static void main(String args[]){ int i=0;i=i++; System.out.println(i);}}
输出 0 , 说实话我第一看也打错了,看看字节码
public class Test {
public Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]);
Code: 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_1 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 14: return}指令3 iinc 1,1 直接+1到第二个变量i 中,这时候i=1;
再执行istore_1 把操作数栈写回到变量i, 这时候i又变成0
我们把代码改改
public class Test{
public static void main(String args[]){ int i=0; //i=i++; i=i+1; System.out.println(i);}}
字节码指令
Compiled from "Test.java"
public class Test { public Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]);
Code: 0: iconst_0 1: istore_1 2: iload_1 3: iconst_1 4: iadd 5: istore_1 6: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 9: iload_1 10: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 13: return}i=i+1 执行的是iadd指令,这是操作数栈里的字节码指令,把新值1压入到操作数栈,再执行istore_1 把操作数栈回写到变量i, 于是i变成了1