java中i=i++问题

class Hello{
    public static void main(String[] args){
        int i = 0;
        i = i++;
    }
}

这段代码中最终i得值为0,并没有发生变化,通过javap获取其关键部分JVM汇编代码如下:

0: iconst_0	      把0压入操作数栈
1: istore_1    弹出操作数栈栈顶元素,保存到局部变量表第1个位置
2: iload_1  将第1个变量压入操作数栈
3: iinc          1, 1 将局部变量表第一个变量自增1  这里并没有将局部变量表中的元素压入数据栈
6: istore_1 弹出操作数栈顶元素

JVM中存在两个存储区,一个为暂存区既堆栈区,一个为变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。

猜你喜欢

转载自blog.csdn.net/beyond_zhangna/article/details/88885506