i++和++i详解(Java中间缓存问题)

i++和++i详解(中间缓存问题)

我们都知道i++和++i的区别在于i++是先用i值,再给i+1;++i是先给i+1,再用i的值。注意一下,当i++和++i单独使用时,两者结果没有区别,但当他们和其他运算符混合运算时,就会出现上述用值与+1顺序的区别。

public class Test1 {
    public static void main(String[] args) {
        int i=10,j=10;
        i++;j++;
        //单独使用两者结果一样
        System.out.println(i +" "+ j);//打印结果为11 11
        int k1=i++;
        int k2=++j;
        //i和j都是11,但k1和k2结果不同
        //计算k1时,先把i值赋给k,再给i+1,所以k1=11,i=12
        //计算k2时,先给j+1,再把j值赋给k,所以k2=12,j=12
        System.out.println(k1 +" "+ k2);//打印结果为11 12
        System.out.println(i +" "+ j);//打印结果为12 12
    }
}

以上阐述的我估计大家都知道,但大家想过以下代码的执行结果是什么吗?

public class Test1 {
    public static void main(String[] args) {
        int i=0,k=0;
        for (int j = 0; j < 10; j++) {
            i=i++;
            k=++k;
        }
        System.out.println(i+" "+k);
    }
}

按照上面对i++和++i的总结,大家可能会认为i=i++可以解析为先把i赋值给等号左边的i,再把i+1赋值给i,这样循环10次,i的结果为10;k=++k可以解析为先给k+1,再把k+1的值为给k,这样循环10次,k的结果为10,所以最终的打印结果为10 10.
我们来看看大家的答案对不对:
在这里插入图片描述
黑人问号脸…

这就要引出Java中的中间缓存变量机制
Java中有一个中间缓存变量机制,当进行++操作时,先用一个中间缓存temp将++的值存起来。
i++:temp=i----->i+1------>把i+1的结果赋给i
j=i++:temp=i------>i+1------>把i+1的结果赋给i------>j=temp
有人可能觉得这和上面说的先用i,再给i+1不同,这里是最后才把存在temp中的i拿来用,大家可以这样理解,先用i,再给i+1和这里的解释虽然不同,但是得到的结果都是j保存i原来的值,而i=i+1,上面的说法是为了让大家更容易理解,这里的说法更符合底层实现。
根据以上解释可知:
i=i++: temp=i------>i+1------>把i+1的结果赋给i------>i=temp
大家看一下,不管怎么加,最后都是把中间缓存temp中的值赋给i,所以i的值还是原来的值。

++i:temp=i----->i+1------>把i+1的结果赋给i和temp
j=++i:temp=i------>i+1------>把i+1的值赋给i和temp------->把temp的值赋给j
在这我是有疑问的,是像我写的那样把i+1的结果赋给i和temp还是不更新temp,直接把i的值赋给j ???我查了很多资料都没有查到,就按照把i+1的值赋给i和temp理解了,如果谁知道,可以在评论区里知道我一下,谢谢。
i=++i:temp=i------>i+1------>把i+1的值赋给i和temp------->把temp的值赋给i,这里等号左边的i得到的永远是加过1的值
看完这些大家应该能理解上面的运行结果为什么是 0 10 而不是 10 10 了吧。

以上均为个人查阅资料后的理解,大家如果觉得有问题欢迎在留言区讨论。

发布了19 篇原创文章 · 获赞 9 · 访问量 2219

猜你喜欢

转载自blog.csdn.net/weixin_44480874/article/details/99295331