(1) 警惕自增的陷阱
java一元运算符有++,--, i++表示先赋值后加1,++i表示先加1后赋值,--同理,但是如果遇到以下代码,你恐怕是阴沟里翻船,不多说,看代码:
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次,等于10吗?运行结果是0, 因为java对自加的处理是:首先把count的值(不是引用),拷贝到一个临时变量区,然后对count变量加1,最后返回临时变量区的值,详细步骤:
步骤1: JVM把count值(当前值为0)拷贝到临时变量区
步骤2: count值加1,这时候count的值是0
步骤3: 返回临时变量区的值,注意这个值是0,没修改过
步骤4: 返回值赋给count,此时count值又被重置为0,如此循环n次都是同样的结果。
可以将count = count++ 改成 count++即可.
(2)break不可丢,尤其是switch结构中
break可以用于终止一段代码的运行,比如循环中break用于跳出整个循环结构,switch用于跳出一个case分支并且不进入其他分支结构的作用,这很重要,不信你看:
String str = "";
int num = 2;
switch (num) {
case 0: str = "零";
case 1: str = "壹";
case 2: str = "贰";
case 3: str = "叁";
case 4: str = "肆";
case 5: str = "伍";
case 6: str = "陆";
case 7: str = "柒";
case 8: str = "捌";
case 9: str = "玖";
case 10: str = "拾";
}
System.out.println(str);
打印的结果是:拾, 这是因为switch结构中,case分支判断成立后,执行case块中的代码,执行完成后,如果没有遇到break关键值,后面的case分支都不进行条件判断,直接执行后面的所有case块代码,这太可怕了.
(3)奇偶判断没你想的那么随便.
什么是奇数,什么是偶数? 能被2整除的除数为偶数,反之则为奇数, 众所周知,那么程序判断是否也是可以有两个公式呢:
1> num%2==0?"偶数":"奇数" ; 2> num%2==1?"奇数":"偶数" 。
想都不想,当然都行啊,随便用。 未必哦,看代码先:
int num = -1;
System.out.println(num%2==1?"奇数":"偶数");
打印的是: 偶数, 靠,有木有搞错。原因是这样的,java中取余算法的模拟代码如下:
${被除数} - ${被除数}/${除数} * ${除数} ,所以咯,-1%2 结果是-1当然不等于1啦.
最好的方式是,用偶判断吧[ num%2==0?"偶数":"奇数" ], 那样才是百分百正确的.