Java篇—自增(自减)陷阱的分析总结

讲述自增(自减)陷阱问题之前,先给大家回顾一下前置++和后置++的区别:

public class Test {
    public static void main(String[] args) {
        System.out.println("i++");
        int i = 3;
        int count = (i++) + (i++) + (i++);
        //i=6
        System.out.println(i);
        //count=3+4+5=12
        System.out.println(count);


        System.out.println("++i");
        int j = 3;
        count = (++j) + (++j) + (++j);
        //j=6
        System.out.println(j);
        //count=4+5+6=15
        System.out.println(count);
    }
}

区别总结如下:

前置++(++i):先给值自增1,然后再参与运算(先赋值再使用);

后置++(i++):先参与运算,然后再给值自增1(先使用再赋值)。

注:前置--(--i)和后置--(i--)的区别同上。

       重点来了,请集中注意力,笔者在刷题时,遇到一个很灵异的事件,话不多说,上代码,如下所示:

public class TestDemo {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10; i++) {
            count = count++;
        }
        System.out.println("count的值为:" + count);
    }
}

最后输出的count值是多少? 我相信很多人都直接会说count为10嘛,这有什么难的!结果是多少,编译器告诉你!!!

惊讶吗?count的值没变,还是最初始的值0,并不是我们认为的10。

福利来了,笔者下去查阅了很多资料,了解到Java的JVM对自增是这样处理的:首先把count 的值(注意是值,不是引用)拷贝到一个临时变量区,然后对 count变量加1,最后返回临时变量区的值。

程序第一次循环时的详细处理步骤如下:

step1:JVM把count值(其值是0)拷贝到临时变量区;

step2:count值加1,这时候count的值是1;

step3:返回临时变量区的值,注意这个值是0,没修改过;

step4:返回值赋值给count,此时count值被重置成0。

注:于是第一次循环后count的值还是0,其他9次的循环也是一样的,最终你会发现count的值始终没有改变,仍然保持着最初的状态。

简而言之,可以将自增理解为如下代码:

public int autoIncrement(int count){  
    //先保存初始值  
    int temp =count;  
    //做自增操作  
    count = count+1;  
    //返回原始值  
    return temp;  
} 

那么,“count = count++”这条语句的代码含义则可以理解为:

temp = count;
count = count + 1;
count = temp;

如果将语句改为,“count = ++count”呢?修改对应代码后:

public class TestDemo {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10; i++) {
            count = ++count;
        }
        System.out.println("count的值为:" + count);
    }
}

运行结果如下:

“count = ++count”这条语句的代码含义则可以理解为:

//前置++嘛,先赋值再使用咯
temp = count + 1;
count = count + 1;
count = temp;

细心阅读此题,不难发现,此代码只是想给count自增10次,那么如果我们将语句“count = count++”改为“count++”,结果毋庸置疑,count的值肯定为10,虽然语句“count = ++count”等效于“count++”,但笔者仍然推荐大家使用语句“count++”,原因很简单,语句“count = ++count”不容易理解。

笔者查阅资料得知,C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。

关于此类陷阱问题,代码总结如下:

public class AutoIncrementAndAutoDecrement {
    public static void main(String[] args) {
        int count1 = 0;
        int count2 = 0;
        int count3 = 0;
        int count4 = 0;
        for (int i = 0; i < 10; i++) {
            count1 = count1++;
            count2 = ++count2;
            count3++;
            ++count4;
        }
        System.out.println("表达式:count1 = count1++ ,循环结束后,count1的值为:" + count1);
        System.out.println("表达式:count2 = ++count2 ,循环结束后,count2的值为:" + count2);
        System.out.println("表达式:count3++ ,循环结束后,count3的值为:" + count3);
        System.out.println("表达式:++count4 ,循环结束后,count4的值为:" + count4);
        System.out.println();
        int num1 = 10;
        int num2 = 10;
        int num3 = 10;
        int num4 = 10;
        for (int j = 0; j < 10; j++) {
            num1 = num1--;
            num2 = --num2;
            num3--;
            --num4;
        }
        System.out.println("表达式:num1 = num1--,循环结束后,num1的值为:" + num1);
        System.out.println("表达式:num2 = --num2,循环结束后,num2的值为:" + num2);
        System.out.println("表达式:num3--,循环结束后,num3的值为:" + num3);
        System.out.println("表达式:--num4,循环结束后,num4的值为:" + num4);
    }
}

输出结果如下:

心得总结:

(1)自增自减操作时,直接使用count++(++count)或者count--(--count)即可;

(2)循环语句中对变量的前置++(--)和后置++(--)的输出结果是相同的。

注:如果变量的修改涉及到表达式,那么就要特别注意前置++(--)和后置++(--)的区别了。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值