今天同事考我一个题求下面代码的结果,我以为是99,没想到运行结果是0,后来百度了下原来是java底层jvm执行方式导致的。
public class JTest {
public static void main(String[] args) {
int i=0;
for (int n=0;n<100;n++){
i=i++;
}
System.out.println(i);
}
}
按网上的解释i=i++在jvm中会在变量区中存在初始变量i,然后将i拷贝一份到堆栈(暂存区),之后变量区中的i会自增1,但最后会将堆栈中的i赋值给变量区的i,并释放堆栈空间,所以i=i++得到的值是变量区中i的值即为0。(下面图可以辅助理解,不过是盗的……)

这样就可以理解原来i++底层并不是真的先赋值再自增,自增其实也是在赋值之前。
那如果是i=++i虽然结果为100在意料之中,不过还是说一下流程:
1、变量区中的i拷贝一份到堆栈(暂存区)
2、变量区i自增1
3、将变量区i赋值给堆栈i
4、将堆栈i赋值给变量区,释放堆栈空间
本文深入探讨Java中i=i++与i=++i运算符的底层实现原理,揭示了JVM执行过程中变量区与堆栈间的交互机制,以及自增操作的实际执行顺序。
4万+

被折叠的 条评论
为什么被折叠?



