i=i++问题

        // 与i++有关的运算过程
        int i = 0;
        i = i++ + ++i + i++ +i++;
        /*
         执行过程:
         1、执行i++,此时i=0
         2、执行++i,此时i=1,补增步骤1的i++,此时i=2
         3、执行i++,此时i=2
         4、执行i++,此时i=2,补增步骤3的i++,此时i=3
         结果:0+2+2+3=7,赋值给i
         注:最后的i++操作停住了
         */
        System.out.println("计算后i="+i);
        int j = 0;
        j = j++ + ++j + j++ +j++ + ++j;
        /*
         5、执行++j,此时j=4,补增步骤4的i++,此时j=5
         最后结果:0+2+2+3+5 = 12
         // 猜测:缓存机制
         j = j++ + ++j + j++ +j++ + +1; // 注意最后一个加数的不同
         最后结果:0+2+2+3+1+1(补增i++) = 9    // 结果证明我这么想不对!!
         */
        System.out.println("计算后j="+j);

   // 看看只有i++的结果
        // Java缓存中间变量的机制???
        int i = 0;
        for(int j = 0;j < 5;j++) { 
            i = i++;
            /*
                //与上句等效!
                int temp = i;
                i=i++;
                i = temp;
            */      
            System.out.println("i="+i); // 统一的0,并没有1,2,3,4,5...
        }

嗯,Java的中间变量缓存机制
看看这两位是怎么说的:
1. http://blog.csdn.net/miderph84/article/details/3390166
2. http://blog.sina.com.cn/s/blog_5d53923e0101bz8p.html

用自己的语言复述一下:
1. 从栈的变化说:栈顶的值为0,将栈顶的值存到变量i中,变量i的值+1。将栈顶的值存到变量i中,最后将i的值赋给i,即还是0。栈之外的就像是缓存。
2. 从返回值的角度说:i++表达式是有返回值的 ,返回值即为i自增前的值。Java对自增是这么处理的,先将变量i的值(不是引用)保存在一个临时的变量区,然后变量i+1,最后返回临时变量区的值。临时变量区就是缓存区。


可是这么做有什么用呢?

发布了57 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shafatutu/article/details/74275710
i++