警惕自增陷阱
自增有两种形式,分别是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个建议)

浙公网安备 33010602011771号