请从字节码角度分析,下列代码运行的结果:
public class Demo3_6_1 {
public static void main(String[] args) {
int i = 0;
int x = 0;
while (i < 10) {
x = x++;
i++;
}
System.out.println(x); // 结果是 0
}
}
看到这个结果,很是大跌眼镜,下面就来从字节码的角度来分析一下这个结果是如何来的吧。
- 进行压栈操作将0压入到操作数栈
- 执行istore指令,将0弹出操作数栈赋值给局部变量表中的X变量
- 执行iload指令,将局部变量中X的值加载到操作数栈(此时X=0)
- 执行iinc指令,对局部变量表中的x变量进行自增运算。(此时局部变量表中的x=1)
- 执行istore指令,将操作数栈中的值(0)弹出栈,重新赋值给局部变量表中的x变量,所以此时的x值又变为0 了
注:可以参考上篇文章的介绍https://blog.csdn.net/Hi_alan/article/details/103869107