警惕自增陷阱

自增有两种形式,分别是i++和++i

       i++ 表示先赋值后加1

       ++i 表示先加1后赋值

这样理解多年没发生问题,直到遇到如下代码,我才怀疑是不是理解错了   

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

这个程序的输出结果 count 不是10,而是0。

count++是一个表达式,是有返回值的,它的返回值就是count自加前的值,

java对于自加是这样处理的:

     首先把count的值(注意是值,不是引用)拷贝到一个临时变量区,

     然后对count变量加1,

     最后返回临时变量区的值,

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

      

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

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

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

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

 

“count=count++”这条语句可以按照如下代码来理解:

public static int mockadd(int  count){

    //先保存初始值

    int temp = count ;

   //做自增操作

    count = count+1;

   //返回初始值

    return  temp;

}

于是第一次循环后count的值还是0,其他9次循环也是一样的,

最终你会发现count 的值始终没有改变,仍然保持最初的状态

此例中本意希望count 自增,不曾想掉入了java自增的陷阱中,

解决方法很简单,只要把“count=count++”修改为“count++”即可

 

该问题在不同语言环境有不同的实现:

                      C++中“count=count++" 与count++是等效的

                      而在PHP中则保持着和java一样的处理方式。

每种语言对于自增的实现方式各不相同,有兴趣的可以多找几种语言测试一下。

 

(转自  编写高质量代码 改善java程序的151个建议)

 

posted @ 2018-12-18 16:33  天霜河白  阅读(151)  评论(0)    收藏  举报