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