public static void main(String[] args) { int i=10; i=i++; System.out.println(i);//输出10 }
以上代码按通常想法,i先参与赋值预算,然后进行自增,结果应该是11,但实际的结果是10.
以下通过对字节指令的分析来看看究竟是怎么回事:
使用javap进行反编译:得到如下字节码:
C:\>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: bipush 10 2: istore_1 3: iload_1 4: iinc 1, 1 7: istore_1 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 11: iload_1 12: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 15: return }
对字节指令的说明:
Code: 0: bipush 10 //将byte1(数据类型为byte)转换为int数据,然后将其压入栈 2: istore_1 //从栈中弹出int类型值,将其存入位置为1的局部变量中,至此完成i=10 3: iload_1 //将位置为1的int类型局部变量压入栈 4: iinc 1, 1 //局部变量自增1,栈里的数据没变,至此完成i++ 7: istore_1 //从栈中弹出int类型值,将其存入位置为1的局部变量中,至此完成i=i++ //因为栈里的值没有变化过,所以i仍然是10 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 11: iload_1 12: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 15: return
用图表示其过程:
以上测试基于JDK1.6