这段程序大概这样:
public static void main(String[] args){int a = 2;System.out.println(a+++a++);
}
编译后的字节码为:
public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=3, locals=2, args_size=10: iconst_2 /*将int型2推送至栈顶*/1: istore_1 /*将栈顶int型数值存入第二个本地变量,这里就是完成a=2的步骤*/2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; /*获取指定类的静态域,并将其值压入栈顶*/ 5: iload_1 /*将第二个int型本地变量推送至栈顶,现在栈顶的值为a的值 2 */6: iinc 1, 1 /*将指定int型变量增加指定值,现在a的值为3 */9: iload_1 /*将第二个int型本地变量推送至栈顶,栈顶的值为 3 */10: iinc 1, 1 /*将指定int型变量增加指定值,现在a为4*/13: iadd /*将栈顶两int型数值相加并将结果压入栈顶,前面压入栈顶的值分别为2和3,所以现在栈顶的值为 5 */14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V17: returnLineNumberTable:line 4: 0line 5: 2line 6: 17
}
SourceFile: "Test.java"
现在,如果把程序换一下:
public static void main(String[] args){int a = 2;System.out.println(a+++(++a));
}
现在字节码为:
public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=3, locals=2, args_size=10: iconst_21: istore_1 /*完成a=2的赋值*/2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;5: iload_1 /*a的值压入栈顶,为 2 */6: iinc 1, 1 /*a自增长 a=3*/9: iinc 1, 1 /*a自增长 a=4*/12: iload_1 /*a值压入栈顶,为 4*/ 13: iadd /*两值相加,为 6*/14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V17: returnLineNumberTable:line 4: 0line 5: 2line 6: 17
}
SourceFile: "Test.java"