官术网_书友最值得收藏!

3.2.2 多路分支

前面提到條件語句的標準格式為“if (條件) { /*條件成立時的操作代碼*/ } else { /*條件不成立時的操作代碼*/ }”,乍看之下仿佛只有兩個分支,一個是條件成立時的分支,另一個是條件不成立時的分支。很明顯僅僅兩個分支不能滿足復雜的業務需求,自然Java代碼也不會傻瓜到固步自封,為此else分支還允許嫁接別的if條件,形如“if (條件一) { } else if (條件二) { } else if (條件三) { } else { }”這樣,無論來幾個條件分支,都能通過“else if”加以判斷和處理。

像之前的猜謎游戲,輸入數字1時打印“涼風有信”的謎底,輸入數字2時打印“秋月無邊”的謎底,現在規定輸入其他數字要打印“按鍵有誤”的提示。此時一共存在3個條件分支,往原來的if/else語句添加一個“else if”即可實現3個分支。下面便是改寫成3個分支之后的代碼例子(完整代碼見本章源碼的src\com\control\process\Multipath.java):

        System.out.println("涼風有信,秋月無邊。打二字");
        System.out.println("獲取“涼風有信”的謎底請按1,獲取“秋月無邊”的謎底請按2");
        Scanner scan=new Scanner(System.in);  // 從控制臺接收輸入文本
        int seq=scan.nextInt();  // nextInt方法表示接收一個整數,以回車鍵結尾
        if (seq == 1) {  // 條件式子1為真時,進入第一個if分支處理
            System.out.println("涼風有信的謎底是“諷”");
        } else if (seq == 2){  //否則繼續判斷條件式子2為真時,進入第二個if分支處理
            System.out.println("秋月無邊的謎底是“二”");
        } else {  // 否則(前面的判斷條件都不滿足)進入else分支處理
            System.out.println("您的按鍵有誤");
        }

隨著分支數量多了起來,豈不是得寫一樣多的“if else”?這種做法雖然可行,但畢竟大費周章,條理也不夠清晰。故而早期的設計師構造了“swicth-case”語句,也被稱作多路分支結構。在該控制流程中,對每個分支都指定了一個數值把關,只有設定的變量符合數值要求,才能進入相應的分支處理。這樣做的好處是方便編譯器在底層優化,既可利用二分查找法加快尋找速度,又可采取地址映射直接找到指定分支。兼容并蓄的Java自然繼承了有利于調優的“swicth-case”,多路分支語句除了swicth和case外,還額外增加了break和default兩個關鍵字。break的作用是跳出整個多路分支,不再執行本分支及其余分支的代碼;default的作用相當于else,所有不滿足已知條件的數值都進入default這個默認分支處理。

仍以猜謎游戲為例,使用“swicth-case”改寫后的多路分支代碼如下(完整代碼見本章源碼的src\com\control\process\Multipath2.java):

    // switch允許判斷某個變量的多個取值,并分別進行單獨處理
    switch (seq) {
        case 1:  // seq值為1時進入該分支
            System.out.println("涼風有信的謎底是“諷”");
            break;  // 跳出多路分支,即跳到switch分支的右花括號之后
        case 2:  // seq值為2時進入該分支
            System.out.println("秋月無邊的謎底是“二”");
            break;  // 跳出多路分支,即跳到switch分支的右花括號之后
        default:  // seq值為其他時進入該分支
            System.out.println("您的按鍵有誤");
            break;  // 跳出多路分支,即跳到switch分支的右花括號之后
    }
    System.out.println("猜謎結束");

多路分支固然好用,但要特別注意以下幾點:

(1)每個case分支末尾務必要加上break語句,否則即使該分支走完了也不會跳出多路分支,而是繼續執行該分支的后面一個分支的代碼,顯然這并非程序員的本意。

(2)多路分支只能判斷整型(含byte、short、int)、字符型、枚舉型3種類型的變量,無法判斷布爾、浮點、雙精度等其他類型的變量。

(3)case語句后面的數值只能做相等判斷,不能開展大于、小于等其他關系運算。

主站蜘蛛池模板: 阳谷县| 阿拉尔市| 科技| 嘉鱼县| 汉川市| 新宾| 信宜市| 宁陕县| 汝城县| 孟连| 永寿县| 宜昌市| 肥东县| 淳安县| 浦县| 铁岭市| 千阳县| 泽普县| 东宁县| 武胜县| 葫芦岛市| 白水县| 昌宁县| 九龙坡区| 临颍县| 霍山县| 拉孜县| 邵东县| 抚顺市| 文山县| 广宁县| 玉龙| 平安县| 延寿县| 云阳县| 兰州市| 靖州| 禄劝| 木里| 蒙山县| 贵南县|