今天同事考我一个题求下面代码的结果,我以为是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赋值给变量区,释放堆栈空间