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

2025-09-30 01:27:17

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的值是多少么?之一

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢