zoukankan      html  css  js  c++  java
  • 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这条指令其实是废指令,执行后又被覆盖。

  • 相关阅读:
    dsoframer设计笔记
    pb 使用ole控制进行WORD操作失败-9
    【学习笔记】Fragment
    Suggest:the suffix for classes name
    ArrayList和LinkedList
    Android Studio入门
    asp.net ToString() 输出格式详细
    Uploadify 3.2 参数属性、事件、方法函数详解
    基础解析正则表达式
    10个优秀的 Web UI库/框架
  • 原文地址:https://www.cnblogs.com/wully/p/3437220.html
Copyright © 2011-2022 走看看