(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?"偶数":"奇数" ], 那样才是百分百正确的.