java自增策略小陷阱

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

/**
 * 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值