Java中i=i++后的值是多少呢?本文就分享一个从bytecode角度的分析
工具/原料
java
javap
IntlliJIDEA
方法/步骤
1、Java中i=i++后的值是多少呢?这个貌似简单的问题水貔藻疽,暗藏玄机!是想考查运算符的优化级?还是自增运算呢?这个问题很难回答撅掏浑锌。既然从语法角度难回答,就会bytecode这个侧面来分析一下吧!下面示例代码的输出会是1,你信吗?现在我们就一块验证一下Showmethecode.Code:packagechapter4;/***CreatedbyMyWorldon2016/3/17.*/publicclassIPlusPlusDemo{publicstaticvoidmain(String[]args){inti=1;i=i++;System.out.println(i);}}
2、执行上面的代码,看看执行结果是什么。拭目以待。。。是1,为什么呢?++操作符的优化级高于=,因此先运算,i++后,i为2,然后再把2赋给i,最后i的值为2才对嘛。想不通。。。
3、既然从语法角度想不能,那就换了角度,从烂瘀佐栾这个java文件生成的字节码文件来分析一下吧。说不定就豁然开朗了呢命令:jav锾攒揉敫ap-cIPlusPlusDemo.class执行结果:Compiledfrom"IPlusPlusDemo.java"publicclasschapter4.IPlusPlusDemo{publicchapter4.IPlusPlusDemo();Code:0:aload_01:invokespecial#1//Methodjava/lang/Object."<init>"()V4:returnpublicstaticvoidmain(java.lang.String[]);Code:0:iconst_11:istore_12:iload_13:iinc1,16:istore_17:getstatic#2//Fieldjava/lang/System.out:Ljavaio/PrintStream;10:iload_111:invokevirtual#3//Methodjava/io/PrintStream.printn:(I)V14:return}
4、inti=1;i=i++;上面两步操作的bytecode是:0:iconst_11:istore_12:iload_13:iinc1,16:istore_1
5、现在来分析一下这几句指令:0:iconst_1//把int型常量1push到栈中,即当前栈顶的值为11:istore_1//pop栈顶的1给变量i。赋值操作(i=1)2:iload_1//push局部变量i的值1入栈,即当前栈顶的值为13:iinc1,1//自增指令。变量i的值加1,执行完成后,i的值为26:istore_1//pop栈顶的1赋给变量i。即变量i存放的值2被栈顶的元素覆盖,变为0
6、现在明白了,为什么i的值没有变化了吧。原因就在于多了这两个指令2:iload_16:istore_1