美文网首页Java学习笔记
警惕自增的陷阱

警惕自增的陷阱

作者: Viking_Den | 来源:发表于2016-09-21 23:15 被阅读14次

记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了:

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

这个程序输出的count等于几?是count自加10次吗?答案等于10?可以非常肯定地告诉你,答案错误!运行结果是count等于0。为什么呢?

count++是一个表达式,是有返回值的,它的返回值就是count自加前的值,Java对自加是这样处理的:首先把count的值(注意是值,不是引用)拷贝到一个临时变量区,然后对count变量加1,最后返回临时变量区的值。程序第一次循环时的详细处理步骤如下:

步骤1 JVM把count值(其值是0)拷贝到临时变量区。

步骤2 count值加1,这时候count的值是1。

步骤3 返回临时变量区的值,注意这个值是0,没修改过。

步骤4 返回值赋值给count,此时count值被重置成0。

// “countcount=count++”这条语句可以按照如下代码来理解:  
public static int mockAdd(int count){  
     //先保存初始值  
     int temp =count;  
     //做自增操作  
     countcount = count+1;  
     //返回原始值  
     return temp;  
} 

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

此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。解决方法很简单,只要把“count=count++”修改为“count++”即可。该问题在不同的语言环境有不同的实现: C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。每种语言对自增的实现方式各不同,读者有兴趣可以多找几种语言测试一下,思考一下原理。

下次如果看到某人T恤上印着“i=i++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。

相关文章

  • 警惕自增的陷阱

    记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加...

  • 警惕自增的陷阱

    记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加...

  • 改善Java程序建议7

    建议7: 警惕自增的陷阱 先看代码: 运行结果count等于0。 首先,count++是一个表达式,是有返回值的,...

  • 警惕自媒体赚钱的陷阱!

    案例,B站搜索“不要再做自媒体的发财梦了”,会出现一堆账号都在说这个话题,甚至文案一模一样,美其名曰是教人做自媒体...

  • i = i++真的很简单?C/C++,java,php探秘

    今天阅读《编写高质量代码:改善Java程序的151个建议》,其中一个是自增的陷阱,才感受到自己对自增的理解还不够,...

  • 我和女朋友的战争

    恋爱当中的女人 每一个问题 都可能是个陷阱 所以 你要做的是 时刻警惕!时刻警惕!时刻警惕! (别问我为什么这么激...

  • 2020-04-03

    警惕幸福的陷阱!完美生活的陷阱!快乐生活的陷阱!生活就是生活本来的样子,酸甜苦辣咸五味俱全,无论痛苦与灾难,活着,...

  • 警惕类比的陷阱

    很多时候,我们用类比来做证据。类比的逻辑是,两个事物在某些重要方面相似,那么其它方面也相似。如果两个事物没有强相关...

  • 警惕欲望的陷阱

    人,一生的欲望太多了: 金钱的欲望,权利的欲望,控制的欲望,占有的欲望,享受的欲望,贪婪的欲望…… 正常的想望和追...

  • 警惕优势陷阱

    许多时候,我们不是跌倒在自己的缺陷上,而是跌倒在自己的优势上。因为缺陷常给我们以提醒,而优势却常常使我们忘乎所以。...

网友评论

    本文标题:警惕自增的陷阱

    本文链接:https://www.haomeiwen.com/subject/mnzaettx.html