i=i++的问题

  1. Java中i=i++后的值是多少呢?这个貌似简单的问题,暗藏玄机!

    是想考查运算符的优化级?还是自增运算呢?

    这个问题很难回答。既然从语法角度难回答,就会bytecode这个侧面来分析一下吧!

    下面示例代码的输出会是1,你信吗?

    现在我们就一块验证一下

    Show me the code.

    Code:

    package chapter4;

    /** 

    * Created by MyWorld on 2016/3/17. 

    */

    public class IPlusPlusDemo {    

        public static void main(String[] args) {        

            int i = 1;       

            i=i++;        

            System.out.println(i);    

        }

    }

    你知道java中 i=i++后i的值是多少么?之一

  2. 执行上面的代码,看看执行结果是什么。

    拭目以待。。。

    是1,为什么呢?

    ++操作符的优化级高于=,因此先运算,

    i++后,i为2,

    然后再把2赋给i,

    最后i的值为2才对嘛。想不通。。。

    你知道java中 i=i++后i的值是多少么?之一

  3. 既然从语法角度想不能,那就换了角度,从这个java文件生成的字节码文件来分析一下吧。说不定就豁然开朗了呢

    命令:

    javap -c  IPlusPlusDemo.class

    执行结果:

    Compiled from "IPlusPlusDemo.java"

    public class chapter4.IPlusPlusDemo {

      public chapter4.IPlusPlusDemo();

        Code:

           0: aload_0

           1: invokespecial #1                  // Method java/lang/Object."<init>"

    ()V

           4: return

      public static void main(java.lang.String[]);

        Code:

           0: iconst_1

           1: istore_1

           2: iload_1

           3: iinc          1, 1

           6: istore_1

           7: getstatic     #2                  // Field java/lang/System.out:Ljava

    io/PrintStream;

          10: iload_1

          11: invokevirtual #3                  // Method java/io/PrintStream.print

    n:(I)V

          14: return

    }

    你知道java中 i=i++后i的值是多少么?之一

  4. int i = 1;

    i=i++;

    上面两步操作的bytecode是:

       0: iconst_1

       1: istore_1

       2: iload_1

       3: iinc          1, 1

       6: istore_1

    你知道java中 i=i++后i的值是多少么?之一

  5. 现在来分析一下这几句指令:

       0: iconst_1  //把int型常量1push到栈中,即当前栈顶的值为1

       1: istore_1  //pop栈顶的1给变量i。赋值操作(i=1)

       2: iload_1   //push局部变量i的值1入栈,即当前栈顶的值为1

       3: iinc          1, 1 //自增指令。变量i的值加1,执行完成后,i的值为2

       6: istore_1 //pop栈顶的1赋给变量i。即变量i存放的值2被栈顶的元素覆盖,变为0

    你知道java中 i=i++后i的值是多少么?之一

  6. 现在明白了,为什么i的值没有变化了吧。

    原因就在于多了这两个指令

           2: iload_1

           6: istore_1

    你知道java中 i=i++后i的值是多少么?之一

猜你喜欢

转载自blog.csdn.net/u011724770/article/details/84675876
i++