java代码编写出现的陷阱-2:阴沟里翻船

(1) 警戒自增的陷阱
java

java一元运算符有++,--, i++表示先赋值后加1,++i表示先加1后赋值,--同理,可是若是遇到如下代码,你恐怕是阴沟里翻船,很少说,看代码:算法

public static void main(String[] args) {ide

   int count = 0;spa

   for (int i = 0; i < 10; i++) {it

       count = count++;class

   }变量

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

相关文章
相关标签/搜索