-
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);
}
}
-
执行上面的代码,看看执行结果是什么。
拭目以待。。。
是1,为什么呢?
++操作符的优化级高于=,因此先运算,
i++后,i为2,
然后再把2赋给i,
最后i的值为2才对嘛。想不通。。。
-
既然从语法角度想不能,那就换了角度,从这个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
}
-
int i = 1;
i=i++;
上面两步操作的bytecode是:
0: iconst_1
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
-
现在来分析一下这几句指令:
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
-
现在明白了,为什么i的值没有变化了吧。
原因就在于多了这两个指令
2: iload_1
6: istore_1
i=i++的问题
猜你喜欢
转载自blog.csdn.net/u011724770/article/details/84675876
今日推荐
周排行