i = i++ 在java字节码层面的分析

有这么一段代码:

package zl.test;

public class PcodeTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        System.out.println(i);

    }

}

输出为 1 ,感觉有些意思,我们来分析下字节码

public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:    iconst_1
   1:    istore_1
   2:    iload_1
   3:    iinc    1, 1
   6:    istore_1
   7:    getstatic    #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   10:    iload_1
   11:    invokevirtual    #22; //Method java/io/PrintStream.println:(I)V
   14:    return

 

iconst_1 : 1(int)值入栈。

istore_1 : 将栈顶引用类型值保存到局部变量1中。

iload_1 : 从局部变量1中装载int类型值入栈。

到这里完成赋值操作,这时在局部变量表中的局部变量1 为 int 1 ,栈顶为为 int 1

 

 

iinc 1,1 :将整数值constbyte加到indexbyte指定的int类型的局部变量中。

这时局部变量表中的局部变量1 为 int  2

 

istore_1 : 将栈顶引用类型值保存到局部变量1中。这时候覆盖了 原来的2,局部变量1又变成了int  1

 

在调用println时,看下第10条指令 , iload_1,他把局部变量1 推入栈顶作为参数。

得出传给println的参数为 1。因此最后输入为 1

 

所以我们可以看出 iinc这条指令其实是废指令,执行后又被覆盖。

 

 

 

posted @ 2013-11-22 11:32  wully  阅读(291)  评论(0编辑  收藏  举报