java自增策略小陷阱

来源:互联网 发布:jing 软件 编辑:程序博客网 时间:2024/05/03 15:38

首先,来一段小程序,我们先猜猜运行结果是怎样?

/** * Created by Song on 2016/8/29. * 自增长测试 */public class Main {    public static void main (String [] args){        int num = 0;        for (int i =0; i<10;i++){            num = num++;            System.out.println("num "+i+" :"+num);        }        System.out.println("最后值:"+num);    }}

我觉得,很大一部分的结果可能是,最终结果num=10. 因为我们一直被教导num++是指先运算后执行自增操作。然而结果是这样吗?真实结果事实上是 num=0!!
这就涉及到不同语言对自增操作的具体实现方式了,在JVM下,num++的实现方式是这样的,首先将num的值复制到临时变量区,然后对原num值做加操作,最后返回临时变量区的num值。我们可以将num++看成是一个函数(方法)体,其执行过程等同于以下代码逻辑:

    int autoIncrement(int num){        int temp = num;        num = num+1;        return  temp;    }

现在可以理解了吧,对于语句 num = num++; 其右边部分可以看成一个上面的函数体,尽管在执行过程中num值确实发生了改变,但右边整体的返回值仍为执行加操作之前的值,所以不管循环多少次,num都是初始值0!!
如果吧num=num++;改成num=++num又是什么情况呢?有了这一次的经验,我们应该能推算到++num 的实现过程是这样的:

    int autoIncrement(int num){        num = num+1;        return  num;    }

所以答案是10!!

0 0