Posted on 2007-11-10 21:32
ZelluX 閱讀(788)
評論(0) 編輯 收藏 所屬分類:
OOP
Pitfall 1:判斷x的奇偶性

public static boolean isOdd(int x)
{
return x % 2 == 1;
}
當x為負奇數時,x % 2的值為負數。
Note:把 x % 2 == 1 改為 x % 2 != 0
Pitfall 2:長整數計算
long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
這個表達式先計算左邊幾個int的乘積,然后再把值轉換為long,因此仍會溢出
Note:把24改成24L
Pitfall 3:看看這句話的結果
System.out.println(12345+5432l);
Note:5432后面的l很容易被看成1,因此建議使用L表示長整形時都使用大寫。
Pitfall 4:下面這句話又會是什么結果
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
Java計算時先用sign-extension把后面一個數轉成long,然后再計算
Note:盡量避免混合類型計算
Pitfall 5:這句話呢?
System.out.println((int) (char) (byte) -1);
結果是65535
Note:char是無符號類型,將char轉為int時使用zero-extension
Pitfall 6:交換變量值
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
最終結果是x == 0, y == 1984
Note:Java中操作符是從左往右計算的 (JLS 15.7)
改成 y = (x ^ (y ^= x) ^ y; 就可以,但是永遠不要這么做
Pitfall 7:問號操作符
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);
輸出結果為X88
Note:同樣是混合類型計算導致的問題,建議在條件表達式中使用類型相同的第二和第三操作符。
Pitfall 8:看似相同的表達式的不同結果
short x = 0;
int i = 123456;
1) x += i; // 隱含了類型轉換,結果為-7616
2) x = x + i; // 編譯無法通過,因為損失了精度