Java開發筆記(十七)各得其所的多路分支

前面提到條件語句的標準格式爲「if (條件) { /* 條件成立時的操做代碼 */ } else { /* 條件不成立時的操做代碼 */ }」,乍看之下彷彿只有兩個分支,一個是條件成立時的分支,另外一個是條件不成立時的分支。很明顯僅僅兩個分支是不能知足複雜的業務需求的,天然Java代碼也不會這麼傻瓜到固步自封,爲此else分支還容許嫁接別的if條件,形如「if (條件一) { } else if (條件二) { } else if (條件三) { } else { }」這樣,無論來幾個條件分支,都能經過「else if」加以判斷和處理。像以前的猜謎遊戲,輸入數字1時打印涼風有信的謎底,輸入數字2時打印秋月無邊的謎底,如今規定輸入其它數字要打印「按鍵有誤」的提示,此時一共存在三個條件分支,往原來的if/else語句添加一個「else if」便可實現三個分支。
下面即是改寫成三個分支以後的代碼例子:java

		System.out.println("涼風有信,秋月無邊。打二字");
		System.out.println("獲取「涼風有信」的謎底請按1,獲取「秋月無邊」的謎底請按2");
		Scanner scan = new Scanner(System.in); // 從控制檯接收輸入文本
		/* nextLine方法表示接收一行文字,以回車鍵結尾 */
		int seq = scan.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」改寫後的多路分支代碼以下所示:程序員

		// 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("猜謎結束");

 

多路分支當然好用,但要特別注意如下幾點:
一、每一個case分支末尾務必要加上break語句,不然即便該分支走完了也不會跳出多路分支,而是繼續執行該分支的後面一個分支代碼,顯然這並不是程序員的本意。
二、多路分支只能判斷整型、字符串、枚舉這三種類型的變量,沒法判斷布爾、浮點、雙精度等其它類型的變量。
三、case語句後面的數值,只能用來進行相等判斷,不能開展大於、小於等其它關係運算。優化

相關文章
相關標籤/搜索