適用於多個互斥條件分支,依序判斷,滿足即執行對應區塊並跳出整個結構。
if (運算式1)
敘述1;
else if (運算式2)
敘述2;
else if (運算式3)
敘述3;
...
else if (運算式m)
敘述m;
else
敘述n; // 所有條件皆假時執行
#include <stdio.h>
void main() {
char c;
printf("input a character: ");
c = getchar();
if (c < 32)
printf("This is a control character\n");
else if (c >= '0' && c <= '9')
printf("This is a digit\n");
else if (c >= 'A' && c <= 'Z')
printf("This is a capital letter\n");
else if (c >= 'a' && c <= 'z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
}
邏輯:ASCII 碼 < 32 為控制字元;'0'~'9' 為數字;'A'~'Z' 大寫;'a'~'z' 小寫;其餘為其他。輸入 'g' 輸出 "small letter"。
if 後運算式不限邏輯/關係運算式,任何運算式皆可:
if (a = 5):指派運算式值為 5(真),後續敘述恆執行if (b):變數值非 0 為真if (a = b) printf("%d", a); else printf("a=0");:將 b 指派給 a,若非 0 輸出 a,否則輸出 "a=0" — 實務常見模式若分支需執行多敘述,必須用大括號包裹成複合敘述,且右大括號後不可加分號。
if (a > b) {
a++;
b++;
} else {
a = 0;
b = 10;
}
巢狀 if 易產生 else 配對歧義:
if (運算式1)
if (運算式2)
敘述1;
else
敘述2;
C 語言規定:else 永遠與最近的未配對 if 配對。上例中 else 屬於內層 if。
// 巢狀寫法:判斷兩數大小
if (a != b)
if (a > b) printf("A>B\n");
else printf("A b) printf("A>B\n");
else printf("A
建議:多分支優先使用 if-else-if,邏輯扁平、易讀、易維護;巢狀僅用於真正的階層決策。
適用於單純指派情境,程式碼簡潔、效率略高。
運算式1 ? 運算式2 : 運算式3
運算式1 為真 → 整體值為 運算式2運算式1 為假 → 整體值為 運算式3
// if-else 版本
if (a > b) max = a;
else max = b;
// 條件運算子版本
max = (a > b) ? a : b;
// 可省略括號:max = a > b ? a : b; (優先級高於指派)
? 與 : 必須成對出現,不可單獨使用a > b ? a : c > d ? c : d 解析為 a > b ? a : (c > d ? c : d) — 條件運算子巢狀void main() {
int a, b, max;
printf("\n input two numbers: ");
scanf("%d%d", &a, &b);
printf("max=%d", a > b ? a : b);
}
| 情境 | 推薦寫法 | 理由 |
|---|---|---|
| 單一條件、單敘述 | if | 簡潔直觀 |
| 雙向分支 | if-else | 結構清晰 |
| 多重互斥分支 | if-else-if | 扁平結構、易讀、效率佳 |
| 階層決策(條件相依) | 巢狀 if | 符合邏輯層次 |
| 單純指派擇一 | 條件運算子 ?: | 程式碼極簡、無分支跳轉開銷 |
| 多值比對(離散值) | switch | 編譯器優化為跳轉表、O(1)查找 |