i=i++的过程分析

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
 

猜你喜欢

转载自avisionav.iteye.com/blog/2280391
i++
今日推荐