語法書 / AA 競程語法書 上冊 / 第三單元 / 巢狀 if 與大括號省略的陷阱

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,判斷它是否:

  1. 是正數?
  2. 如果是正數,是否是三位數(100-999)?
  3. 如果是三位數,它是不是偶數(用 n % 2 == 0 判斷)?

用巢狀 if 實現,並且每個 if 都加大括號