1. 巢狀 if 的基礎語法
在真實世界中,很少只憑一個條件就能做決策。通常需要同時檢查多個條件,而且它們彼此之間常常有依賴關係。比如要參加演唱會,光是成年還不夠——有時你還得在受邀名單上。這時就需要所謂的多層次邏輯,而巢狀的 if 能幫上忙。
巢狀條件就是當一個 if 放在另一個裡面。想像「箱中有箱」:只有外層條件成立,才會檢查內層。這是控制流程的強大工具。
先從簡單的開始:
if (uslovieA)
{
// 若 uslovieA 為 true(真)時要執行的動作
if (uslovieB)
{
// 若兩個條件都為真時要執行的動作
}
}
if 內的巢狀
if
如果這讓你想到俄羅斯套娃,那就對了!只有外層成立時,內層 if 才會執行。
範例:進入俱樂部
讓我們擴充先前的教學應用,使用者之前輸入了姓名與年齡。現在加上第二層檢查:例如,要進入封閉式俱樂部,必須年滿 21 歲 且擁有邀請碼。
System.out.print("請輸入您的姓名: ");
String name = console.nextLine();
System.out.print("請輸入您的年齡: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("請輸入邀請碼: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("歡迎," + name + ",進入 VIP 俱樂部!");
}
else
{
System.out.println("抱歉,代碼不正確。拒絕存取。");
}
}
else
{
System.out.println("抱歉,僅限年滿 21 歲入場!");
}
請注意:只有在年齡已通過檢查時,內層 if 才會驗證代碼。這既省資源(也省保全的耐性)。
2. 可以巢狀幾層?
技術上——想要多少層都行。但在實務上:巢狀層數越多,程式越難讀、越難維護。通常會盡量控制在 2–3 層。如果出現 4 層以上的「樓梯」式 if,想想能否簡化邏輯,或把檢查抽出成方法。
3. 巢狀 if 與 else:陷阱與細節
新手常犯的錯:大括號用得不夠嚴謹。
在 Java 中,使用 else 有一條硬規則:若不加大括號 {},則 if 或 else 只會套用到它後面的第一個語句。這是一個常見的 bug 來源。
可能出錯的範例:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("歡迎!");
else
System.out.println("代碼不正確。");
許多人預期 else 會對應到年齡的檢查,但實際上它會對應到離它最近的 if(檢查邀請碼的那個)。因此訊息可能與預期不符。最好一律加上大括號——就算裡面只有一行!
為了避免誤會,編譯器看到的其實等同於:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("歡迎!");
else
System.out.println("代碼不正確。");
}
重要!再強調一次:在 if-else 結構中,如果沒有使用大括號,else 會對應到前一個(離它最近的)if。
4. 替代做法:else if 在巢狀條件中
有時在外層的 if 中,不只想檢查額外條件,還想提供替代方案。比如,若邀請碼不符合,可以提供訪客模式或直接拒絕。
if (age >= 21)
{
System.out.print("請輸入邀請碼: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("歡迎加入俱樂部!");
}
else if (code.equals("GUEST"))
{
System.out.println("訪客模式:僅能存取至 23:00。");
}
else
{
System.out.println("很遺憾,無法提供存取。");
}
}
else
{
System.out.println("僅限年滿 21 歲入場。");
}
在外層選擇之內,我們又做了一個三向的巢狀選擇:VIP 代碼、訪客代碼,以及拒絕。
5. 練習:具有多層邏輯的折扣計算器
假設要根據使用者的年齡與是否持有會員卡來計算折扣。
- 如果使用者年齡大於或等於 60 —— 折扣 15%。
- 如果年齡較小,但有會員卡 —— 折扣 7%。
- 其他情況則沒有折扣。
要怎麼寫?
System.out.print("請輸入您的年齡: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("您是否有會員卡(是/否)? ");
String hasCard = console.nextLine();
if (hasCard.equals("是"))
{
discount = 0.07;
}
}
System.out.println("您的折扣: " + (discount * 100) + "%");
這裡我們在 else 分支內使用了巢狀的 if:如果年齡不符合,才會詢問是否持有會員卡。
GO TO FULL VERSION