6-2 建立 if 和 if/else 陳述

在生活中經常會有這麼的對話:「如果我中了樂透,就可以去環遊世界!」、「如果我...就...,要不然就...」。

撰寫程式的目的之一,就是在應付生活中的一些條件假設與動作執行,例如「如果使用者輸入 0,就停止執行程式。」、「如果使用者密碼輸入錯誤,請顯示重新輸入畫面。」對於這樣的需求,在 Java 程式語言中,您可以使用 if、if/else 陳述來為程式進行各種條件判斷與流程控制。

圖6-3、使用 if 陳述來進行條件判斷與執行

• if 結構

基本的 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 後的陳述句,一個執行的結果如下所示:

圖6-4、程式碼 6-2 的執行範例

如果在 if 判斷為 true 時,有數個想要執行的陳述句,也就是執行所謂的複合陳述句( Compound statement ),那麼要使用花括號來定義出執行區塊(Block),使用的格式如下:

if ( boolean_expression ) {
    code_block;
    ...
}// if 結尾
// 繼續往下執行程式
                            

當 if 括號中的運算式結果為 true 時,會執行使用花括號所定義出來的區塊中所有的陳述句,一個使用範例如下:

if(input == 36) {
    System.out.println("恭喜您猜對了!");
    System.out.println("數值為 " + 36);
}
                            

圖6-5、根據判斷式來決定是否執行陳述句

• 巢狀 if 結構

有些時候您可能需要把 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 判斷式。

• if/else 結構

通常您想要在判斷式為 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-6、if/else 結構依判斷式決定要執行的區塊

程式碼 6-3 的執行結果如下所示:

圖6-7、程式碼 6-3 的執行結果

• 鏈狀 if/else 結構

您在可在 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 時,就執行對應的區塊,之後的判斷式就不再進行比對,執行的結果如下所示:

圖6-8、程式碼 6-4 的執行結果

在撰寫 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-9、三元運算子?:的使用

可以使用這個三元運算子來改寫一下程式碼 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 所示:

圖6-10、程式碼 6-5 的執行結果

圖6-11、開車時的結策判斷