理解運算符優先級與結合性,是寫出正確表達式、避免邏輯 Bug 的基礎。Java 遵循「高優先級先算、同級看結合性」原則。
| 優先級 | 運算符 | 說明 | 結合性 |
|---|---|---|---|
| 1 | [] . () | 數組訪問、成員訪問、方法調用、括號 | 左→右 |
| 2 | ++ -- + - ~ ! | 後置/前置自增減、正負號、位非、邏輯非 | 右→左 |
| 3 | * / % | 乘除取模 | 左→右 |
| 4 | + - | 加減 / 字符串連接 | 左→右 |
| 5 | << >> >>> | 左移、有符號右移、無符號右移 | 左→右 |
| 6 | < <= > >= instanceof | 關係比較、類型檢查 | 左→右 |
| 7 | == != | 相等性比較 | 左→右 |
| 8 | & | 按位與 / 邏輯與(不短路) | 左→右 |
| 9 | ^ | 按位異或 / 邏輯異或 | 左→右 |
| 10 | | | 按位或 / 邏輯或(不短路) | 左→右 |
| 11 | && | 短路邏輯與 | 左→右 |
| 12 | || | 短路邏輯或 | 左→右 |
| 13 | ? : | 三元條件運算符 | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 賦值及復合賦值 | 右→左 |
| 15 | -> | Lambda 箭頭 (Java 8+) | 右→左 |
a - b - c ≡ (a - b) - c。++x --x +x -x ~ !a = b = c = 1 ≡ a = (b = (c = 1))a ? b : c ? d : e ≡ a ? b : (c ? d : e)// 1. 自增減陷阱
int x = 5;
int y = x++ + ++x; // 步驟:x++ 用 5 → x=6;++x 先增 → x=7 用 7;y=5+7=12
// 2. 賦值右結合
int a, b, c;
a = b = c = 10; // c=10 → b=10 → a=10
// 3. 三元嵌套
int score = 85;
String level = score >= 90 ? "優" : score >= 60 ? "良" : "差"; // 正確嵌套
// 4. 短路邏輯副作用
boolean flag = true || (++x > 0); // || 短路,++x 不執行,x 不變
// 5. 字符串連接優先級
System.out.println("結果:" + 1 + 2); // "結果:12"
System.out.println("結果:" + (1 + 2)); // "結果:3"
System.out.println(1 + 2 + " 是結果"); // "3 是結果"
**當優先級不確定時,加括號**。括號不僅改變求值順序,更是給維護代碼的人(包括未來的自己)看的文檔。編譯器會優化掉多餘括號,**零運行時開銷**。