在生活中經常會有這麼的對話:「如果我中了樂透,就可以去環遊世界!」、「如果我...就...,要不然就...」。
撰寫程式的目的之一,就是在應付生活中的一些條件假設與動作執行,例如「如果使用者輸入 0,就停止執行程式。」、「如果使用者密碼輸入錯誤,請顯示重新輸入畫面。」對於這樣的需求,在 Java 程式語言中,您可以使用 if、if/else 陳述來為程式進行各種條件判斷與流程控制。
基本的 if 結構很簡單,您給它一個條件運算式,根據運算結果為 true 或 false 來決定是否執行下一句陳述句,最簡單且最常見的格式為:
if ( boolean_expression ) statement; // 繼續往下執行程式
直接以程式實例來說明,程式碼 6-2 可以判斷使用者的輸入是奇數還是偶數。
public class OddTest{ public static void main(String[] args){ java.util.Scanner scanner = new java.util.Scanner(System.in); System.out.print("輸入整數:"); int input = scanner.nextInt(); if(input % 2 == 0) // 如果餘數為 0 System.out.println(input + " 是偶數"); if(input % 2 != 0) // 如果餘數不為 0 System.out.println(input + " 是奇數"); } }程式碼 6-2 OddTest.java
程式碼 6-2 將使用者的輸入除以 2,看看餘數是不是為 0 來判斷使用者的輸入為奇數還是偶數,只有在 if 括號中的條件式結果為 true 時,才會執行緊跟著 if 後的陳述句,一個執行的結果如下所示:
如果在 if 判斷為 true 時,有數個想要執行的陳述句,也就是執行所謂的複合陳述句( Compound statement ),那麼要使用花括號來定義出執行區塊(Block),使用的格式如下:
if ( boolean_expression ) { code_block; ... }// if 結尾 // 繼續往下執行程式
當 if 括號中的運算式結果為 true 時,會執行使用花括號所定義出來的區塊中所有的陳述句,一個使用範例如下:
if(input == 36) { System.out.println("恭喜您猜對了!"); System.out.println("數值為 " + 36); }
有些時候您可能需要把 if 陳述當成另一個 if 陳述中的一部份,即形成所謂的巢狀 if 結構,例如:
if ( boolean_expression1 ) { code_block1; ... if ( boolean_expression2 ) { code_block2; } // if 結尾 ... } // if 結尾 // 繼續往下執行程式
當 boolean_expression1 判斷為 true 時,才會執行code_block1 定義的內容,此時執行到第二個 if 判斷式時,如果 boolean_expression2 為 true , 才會又執行 code_block2,如果 boolean_expression1 一開始就判斷為false,則 code_block1 中的內容就不會被執行,更不會執行到當中的第二個 if 判斷式。
通常您想要在判斷式為 true 時,執行程式的一個區塊,而在運算式為 false 時,執行程式的另一個區塊。此時您可用一個 if 敘述來包含判斷式成立必需執行的程式碼,以及一個else 敘述,包含只有在判斷式不成立時才能執行的程式碼。if/else 的使用方式為:
if ( boolean_expression ) { code_block_1; } // if 結構結尾 else { code_block_2; } // else 結構結尾 // 程式由此繼續
重點提示
如果區塊中只有一行陳述句,則可以省略花括號,不過也有開發人員建議,即使只有一行陳述句,最好也用花括號標示區塊,這樣可以讓程式容易閱讀。
在程式碼 6-2 中,您使用了兩個 if 判斷式來判別使用者輸入的數值是否可以被 2 整除,程式執行時,無論如何都會執行那兩個判斷式,您應該改用 if/else 結構,以增進程式執行的效率,如程式碼 6-3 所示:
public class OddTest2{ public static void main(String[] args){ java.util.Scanner scanner = new java.util.Scanner(System.in); System.out.print("輸入整數:"); int input = scanner.nextInt(); if(input % 2 == 0){ System.out.println(input + " 是偶數"); } else{ System.out.println(input + " 是奇數"); } } }程式碼 6-3 OddTest2.java
如果 input%2 的餘數為 0,則會執行第 10 行,否則就執行第 13 行,兩個區塊只會擇一執行。
程式碼 6-3 的執行結果如下所示:
您在可在 if/else 結構中的 else 區塊再撰寫 if/else,例如:
if ( boolean_expression_1 ) { code_block_1; } // if 結構結尾 else { if ( boolean_expression_2 ) { code_block_2; } // if 結構結尾 else { code_block_3; } // else 結構結尾 }
由於 else 後直接撰寫 if 陳述句,所以可以不使用括號,因而常常會撰寫為以下的形式,看起來比較容易閱讀:
if ( boolean_expression_1 ) { code_block_1; } else if ( boolean_expression_2 ) { code_block_2; } else { code_block_3; }
舉個實際的例子來說,您可以使用上面的結構,撰寫一個成績分級程式,如程式碼 6-4 所示範的:
public class ScoreLevel{ public static void main(String[] args){ java.util.Scanner scanner = new java.util.Scanner(System.in); System.out.print("輸入分數:"); int score = scanner.nextInt(); if (score >= 90) System.out.println("得 A"); else if (score >= 80 && score < 90) System.out.println("得 B"); else if (score >= 70 && score < 80) System.out.println("得 C"); else if (score >= 60 && score < 70) System.out.println("得 D"); else System.out.println("得 E(不及格)"); } }程式碼 6-4 ScoreLevel.java
程式執行時,會一個一個比對判斷式中的條件是否符合,如果遇到判斷式為 true 時,就執行對應的區塊,之後的判斷式就不再進行比對,執行的結果如下所示:
在撰寫 if/else 結構時,需注意到如果不使用花括號定義出區塊的話,每一個 if 是與最接近的 else 配對,例如初學者可能會這麼撰寫:
if ( boolean_expression_1 ) if ( boolean_expression_2 ) code_block_1; else code_block_2;
在 Java 語言中提供了一個與 if/else 類似功能的三元運算子?:,它的使用方式如下所示:
boolean_expression ? result_1 : result_2;
之所以稱之為三元運算子,是因為您必須提供三個運算元作為它運算時所需的數值,如果 boolean_expression 的運算結果為 true 的話,就傳回 result_1 的值,如果boolean_expression 的運算結果是 false 的話,就傳回result_2 的值。
可以使用這個三元運算子來改寫一下程式碼 6-3,判斷使用者輸入的是奇數還是偶數:
public class OddTest3{ public static void main(String[] args){ java.util.Scanner scanner = new java.util.Scanner(System.in); System.out.print("輸入整數:"); int input = scanner.nextInt(); int remain = input % 2; System.out.println(input + " 是" + ((remain == 0) ? "偶數" : "奇數")); } }程式碼 6-5 OddTest3.java
如果(remain == 0)運算結果為 true,則傳回"偶數"的字串,如果運算結果為 false,則傳回"奇數"的字串,程式的執行結果如圖 6-10 所示: