// 邏輯或 || —— 短路求值
int x, y = 10;
if (((x = 0) == 0) || ((y = 20) == 20)) {
System.out.println(y); // 輸出 10,第二個賦值表達式未執行
}
// 位或 | —— 全執行求值
int a, b = 10;
if (((a = 0) == 0) | ((b = 20) == 20)) {
System.out.println(b); // 輸出 20,兩個賦值表達式均執行
}
| 特性 | 邏輯運算符 (&& ||) | 位運算符 (& |) |
|---|---|---|
| 操作數類型 | boolean | 整數類型 / boolean |
| 求值策略 | 短路:左側能決定結果則右側不執行 | 非短路:所有操作數無條件執行 |
| 典型用途 | 條件判斷、守衛子句 | 位掩碼、標誌位組合、權限位運算 |
| 副作用執行 | 右側含副作用(賦值、方法調用)可能不執行 | 副作用保證執行 |
// 危險:邏輯或導致初始化漏執行
if (obj == null || obj.initialize()) { ... } // obj 為 null 時 initialize() 不調用
// 安全:位或保證執行(但語義怪異,僅作演示)
if (obj == null | obj.initialize()) { ... }
// 推薦寫法:分離關注點
boolean needInit = (obj == null);
if (needInit) obj.initialize();
if (needInit || obj.isValid()) { ... }
if (str != null && str.length() > 0))flags & MASK、flags | MASK、flags ^ MASK理解短路與全執行的語義邊界,能寫出更安全、更可讀的條件表達式。