// 原版:正確 (互斥條件)
if (is_letter) letter++;
else if (is_digit) digit++;
else if (is_space) space++;
else others++;
// 修改後:錯誤 (條件不再互斥)
if (is_letter) letter++;
if (is_digit) digit++; // 字母也可能進入這裡?否,但空格會進入 others
if (is_space) space++;
if (/* 其他 */) others++; // 所有不滿足前面條件的都進這裡,但缺少 else 導致邏輯變「全檢查」
`else if` 形成**互斥分支**:滿足一個條件後**跳過後續所有判斷**。
多個獨立 `if` 形成**順序檢查**:每個條件**都會被評估**,不互斥。
輸入字元 `'A'`:
輸入字元 `' '` (空格):
// 方案一:恢復 else if (推薦,語義清晰、效能略高)
if (is_letter) {
letter++;
} else if (is_digit) {
digit++;
} else if (is_space) {
space++;
} else {
others++;
}
// 方案二:若必須用獨立 if,需精確設計互斥條件 (不推薦)
if (is_letter) letter++;
else if (is_digit) digit++; // 這裡其實又是 else if...
// 結論:分類統計必須用 if-else if-else 鏈
原代碼片段:
for (i = 0; str[i] != '\0'; i++)
if (is_letter) letter++;
else if (is_digit) digit++;
// ...
**無大括號時,`for` 僅控制緊隨其後的單一語句 (第一個 `if`)**。`else if` 鏈屬於該 `if` 的一部分,結構正確。但可讀性極差,極易改錯。
for (i = 0; str[i] != '\0'; i++) {
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) {
letter++;
} else if (str[i] >= '0' && str[i] <= '9') {
digit++;
} else if (str[i] == ' ') {
space++;
} else {
others++;
}
}
| 規則 | 理由 |
|---|---|
| 所有控制結構 (`if/else/for/while`) **強制加大括號** | 防止「懸空 else」、插入語句導致邏輯錯誤、提升可讀性 |
| 互斥分類統計**必須用 `if-else if-else`** | 語義精確、避免重複計數、編譯器可優化跳轉表 |
| 條件判斷提取為**具名布爾變數/函數** | `is_letter = isalpha(ch)` 可讀性遠超字元比較鏈 |
| 使用 ` | 支援本地化、碼表無關、無邊界錯誤 |