+ - * / % ++ --> >= < <= == !=(結果為 boolean)& | ! ^ && ||(僅適用 boolean)int a = 2147483647 * 2; // 結果 -2 (溢出)
long b = 2147483647 * 2L; // 正確:至少一個操作數標記 L
double d = 10 / 4; // 2.0 (先整除再賦值)
double d = 10 / 4.0; // 2.5
double d = 10 / (double)4; // 2.5
float f = 0.1f * 0.1f; // 0.010000001
double d = 0.1 * 0.1; // 0.010000000000000002
原因:二進制無法精確表示十進制小數(如 0.1),後續文章將深入 IEEE 754 表示解析。
| 代碼 | 等效邏輯 | 說明 |
|---|---|---|
b = a++ - 1 | b = a - 1; a = a + 1; | 先用原值運算,再自增 |
c = ++a - 1 | a = a + 1; c = a - 1; | 先自增,再用新值運算 |
arrA[i++] = arrB[++j] | j++; arrA[i] = arrB[j]; i++; | 混合使用極易讀錯,建議拆行 |
== vs =:前者比較,後者賦值。== 比較引用地址,非內容。內容比較需逐元素或用 Arrays.equals()。
boolean a = true; int b = 0;
boolean flag = a | (b++ > 0); // b 變 1,右邊仍執行
boolean flag = a || (b++ > 0); // b 仍 0,短路跳過右邊
&&、|| 具備短路求值,能避免不必要計算及空指針風險(如 obj != null && obj.method())。
大多符合直覺(算術 > 比較 > 邏輯)。不確定時加括號,明確表達意圖,提升可讀性。
關注「老馬說編程」獲取最新深度解析。