讲述自增(自减)陷阱问题之前,先给大家回顾一下前置++和后置++的区别:
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)循环语句中对变量的前置++(--)和后置++(--)的输出结果是相同的。
注:如果变量的修改涉及到表达式,那么就要特别注意前置++(--)和后置++(--)的区别了。