这段程序大概这样:java
public static void main(String[] args){ int a = 2; System.out.println(a+++a++); }
编译后的字节码为:code
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=2, args_size=1 0: 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)V 17: return LineNumberTable: line 4: 0 line 5: 2 line 6: 17 } SourceFile: "Test.java"
如今,若是把程序换一下:ip
public static void main(String[] args){ int a = 2; System.out.println(a+++(++a)); }
如今字节码为:get
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=2, args_size=1 0: iconst_2 1: 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)V 17: return LineNumberTable: line 4: 0 line 5: 2 line 6: 17 } SourceFile: "Test.java"