1. 程式人生 > >Java開發筆記(十七)各得其所的多路分支

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

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

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

 

多路分支固然好用,但要特別注意以下幾點:
1、每個case分支末尾務必要加上break語句,否則即使該分支走完了也不會跳出多路分支,而是繼續執行該分支的後面一個分支程式碼,顯然這並非程式設計師的本意。
2、多路分支只能判斷整型、字串、列舉這三種類型的變數,無法判斷布林、浮點、雙精度等其它型別的變數。
3、case語句後面的數值,只能用來進行相等判斷,不能開展大於、小於等其它關係運算。