運算子是構建表達式的基礎元素。掌握優先序、結合性、各類型運算特性與型別提升規則,能寫出正確且高效的表達式。
| 優先序 | 運算子 | 結合性 | 說明 |
|---|---|---|---|
| 1 | [] . () | 左→右 | 陣列存取、成員存取、方法呼叫 |
| 2 | ++ -- + - ~ ! | 右→左 | 一元運算子(後置 ++/-- 例外) |
| 3 | * / % | 左→右 | 乘法、除法、取餘 |
| 4 | + - | 左→右 | 加法、減法、字串串接 |
| 5 | << >> >>> | 左→右 | 位移運算 |
| 6 | < > <= >= instanceof | 左→右 | 關係比較 |
| 7 | == != | 左→右 | 相等比較 |
| 8 | & | 左→右 | 位元 AND / 布林 AND(不短路) |
| 9 | ^ | 左→右 | 位元 XOR / 布林 XOR |
| 10 | | | 左→右 | 位元 OR / 布林 OR(不短路) |
| 11 | && | 左→右 | 條件 AND(短路) |
| 12 | || | 左→右 | 條件 OR(短路) |
| 13 | ?: | 右→左 | 三元條件運算子 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 右→左 | 指派與複合指派 |
範例:a = b + c * d / (c ^ d) → 先算括號 c^d,再 c*d,再除,最後加 b 指派給 a。
| 運算子 | 操作 | 範例 | 副作用 |
|---|---|---|---|
+ | 正號(無實際作用) | +5 | 無 |
- | 負號(取反) | -i | 無 |
~ | 位元補數(逐位取反) | ~0 = -1 | 無 |
++ | 遞增 1 | ++i / i++ | 改變變數值 |
-- | 遞減 1 | --i / i-- | 改變變數值 |
前置 vs 後置:++i 先增後用;i++ 先用後增。複合表達式中差異顯著:int x = i++ vs int x = ++i。
+ - * / %:標準四則運算與取餘。5/2=2, -5/2=-2)。ArithmeticException。Integer.MAX_VALUE + 1 = Integer.MIN_VALUE)。& | ^ ~ << >> >>>:操作二進位表示。>> 算術右移(保留符號位),>>> 邏輯右移(補 0)。x & 1 判斷奇偶、x << n 等價 x * 2^n。x += 5; // 等價 x = x + 5
x <<= 2; // 等價 x = x << 2
< > <= >= == != → 產生 boolean。! && ||。&& 左側 false 不評估右側;|| 左側 true 不評估右側。& | ^ 用於布林時不短路(罕用)。結果 = 條件 ? 真值 : 假值;
// 範例:取較大值
int max = (a > b) ? a : b;
0.1 + 0.2 != 0.3,貨幣計算用 BigDecimal。NaN、Infinity、-Infinity、-0.0。NaN != NaN 為 true,用 Double.isNaN() 檢查。double → 結果為 double;否則 float。+:串接,非字串運算元自動 toString()。+=:串接指派。s += x 產生大量中間物件,用 StringBuilder。| 轉換類型 | 範例 | 風險 |
|---|---|---|
| 自動擴展(安全) | byte→short→int→long→float→double | 無資料遺失 |
| 窄化轉換(需強制) | (int) d, (byte) i | 截斷/精度遺失 |
| 基本型別↔包裝類別 | 自動裝箱/拆箱 | NullPointerException 風險 |
安全轉換鏈:byte→short/char→int→long→float→double(單向)。