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?"偶數":"奇數" ], 那樣纔是百分百正確的.

相關文章
相關標籤/搜索