選擇結構是程式邏輯分支的核心。本文系統講解 if 三種形式、switch 語法規則、執行流程、常見陷阱,並給出場景化選擇建議。
if (關係表達式) {
語句體;
}
boolean 型if (關係表達式) {
語句體1;
} else {
語句體2;
}
condition ? expr1 : expr2 邏輯等價,但三元運算符要求有返回值,不能用於單純輸出語句if (表達式1) {
語句體1;
} else if (表達式2) {
語句體2;
} ...
else {
語句體N;
}
else 為兜底,可省略 (但不建議)switch (表達式) {
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
...
default:
語句體N;
break;
}
| JDK 版本 | 支援類型 |
|---|---|
| JDK 1.0-1.4 | byte, short, int, char |
| JDK 5 (1.5) | + enum (枚舉) |
| JDK 7 (1.7) | + String |
不支援:long, float, double, boolean, 物件引用 (除 String/enum)
| 場景 | 推薦 | 理由 |
|---|---|---|
| 布林條件判斷 | if | switch 不支援 boolean |
| 區間/範圍判斷 | if | switch 只能匹配離散值 |
| 少量離散常量值 | switch | 編譯器優化為跳躍表,效能優於 if 鏈 |
| String/Enum 匹配 | switch | 語意清晰,JDK 7+ 優化 String hash 比較 |
| 複雜複合條件 | if | switch 無法表達 &&、|| 組合 |
int a = 1, b = 2;
if (a = b) { ... } // 編譯錯誤:int 不能當 boolean
boolean x = true, y = false;
if (x = y) { ... } // 編譯通過!將 y 賦值給 x,再判斷 x 值 (false)
int day = 2;
switch (day) {
case 1: System.out.print("Mon ");
case 2: System.out.print("Tue ");
case 3: System.out.print("Wed ");
default: System.out.print("Other");
}
// 輸出:Tue Wed Other (無 break 導致穿透)
// 錯誤:System.out.println 無返回值,不能作為三元運算元
int score = 80;
(score > 60) ? System.out.println("Pass") : System.out.println("Fail"); // 編譯錯誤
// 正確:用 if-else 或有返回值的表達式
String result = (score > 60) ? "Pass" : "Fail";
if-else 處理布林邏輯、區間判斷switchbreak,必要時加註釋說明故意穿透精通選擇結構的細節差異,能寫出更清晰、高效、少 Bug 的分支邏輯代碼。