本人初学者,最近遇到这样一个问题:
public class testInc {
public static void main(String[] args) {
int i = 0;
i = i++;
System.out.println(i);
//System.out.println(j);
}
}
输出结果是 0.
一开始很费解,于是用javap反汇编了一下,才逐渐了解原因。
可以看到流程为
iconst_0 表示将常数0存入栈,栈顶为0
istore_1 表示从栈顶pop存入变量1(即i),此处即 i = 0,此时栈为空
iload_1 表示将变量1push入栈,栈顶为0
iinc 表示对变量1自增1,此时 i = 1
istore_1 表示从栈顶pop存入变量1,此时 i = 0
可知上一步自增的结果被再次从栈pop并存储的操作给覆盖了,这就是结果为0的原因。
另外,如果将代码改为如下,
public class testInc {
public static void main(String[] args) {
int i = 0;
int j = i++;
System.out.println(j);
//System.out.println(j);
}
}
结果仍为0
反汇编结果如图
也没什么结论,因为没做进一步分析,也不是很了解jvm,简单来看就是java中操作数都在栈中,总之iinc指令很奇怪。