3.6 巢狀 if 與大括號省略的陷阱
有時候,我們需要在一個 if 分支裡再檢查另一個條件。這就是巢狀 if。同時,我們要小心大括號省略的陷阱。
¶巢狀 if 的語法
if (條件1) {
if (條件2) {
// 條件1 和 條件2 都為 true 時執行
} else {
// 條件1 為 true,條件2 為 false 時執行
}
} else {
// 條件1 為 false 時執行
}
¶範例程式碼:登入系統
#include <iostream>
using namespace std;
int main() {
int id, pin;
cin >> id >> pin;
if (id == 1001) { // 檢查帳號
if (pin == 1234) { // 檢查密碼
cout << "Login OK" << endl;
} else {
cout << "Wrong password" << endl;
}
} else {
cout << "User not found" << endl;
}
return 0;
}
執行結果(輸入 1001 和 1234)
Login OK
¶大括號省略的陷阱:dangling else
3.5 提過,if 底下只有一行時大括號可以省略。單純一個 if 這樣寫沒問題,但一旦巢狀的 if 遇上 else,省略大括號就會出事——else 會自動和最近、還沒有配對的 if 配對,而不是你以為的那個:
// ✗ 看起來你想表達:
// 如果 x > 5,輸出 "A"
// 如果 x > 5 且 y > 10,輸出 "B"
// 否則,輸出 "C"
if (x > 5)
if (y > 10)
cout << "B";
else
cout << "C"; // ← 這個 else 會配對內層的 if (y > 10)
// C++ 實際理解為:
if (x > 5) {
if (y > 10) {
cout << "B";
} else { // ← 配對內層 if,而不是外層 if
cout << "C";
}
}
// 結果:當 x <= 5 時,什麼都不輸出(錯誤)
// ✓ 正確做法:加大括號確保配對正確
if (x > 5) {
if (y > 10) {
cout << "B";
}
} else { // ← 現在明確配對外層 if
cout << "C";
}
¶巢狀 if 的最佳實踐
#include <iostream>
using namespace std;
int main() {
int age;
bool has_license;
cin >> age >> has_license;
// ✓ 好習慣:即使只有一個語句,也加大括號
if (age >= 18) {
if (has_license) {
cout << "Can drive" << endl;
} else {
cout << "Old enough but no license" << endl;
}
} else {
cout << "Under 18" << endl;
}
return 0;
}
¶動手試試看
寫一個程式,輸入一個整數 n,判斷它是否:
- 是正數?
- 如果是正數,是否是三位數(100-999)?
- 如果是三位數,它是不是偶數(用
n % 2 == 0判斷)?
用巢狀 if 實現,並且每個 if 都加大括號。