1. 程式人生 > >Java開發筆記(十六)非此即彼的條件分支

Java開發筆記(十六)非此即彼的條件分支

目的 占用 true 五行 控制 java highlight 動作 遊戲

前面花了大量篇幅介紹布爾類型及相應的關系運算和邏輯運算,那可不僅僅是為了求真值或假值,更是為了通過布爾值控制流程的走向。在現實生活中,常常需要在岔路口抉擇走去何方,往南還是往北,向東還是向西?在Java編程中,利用if語句可判斷接下來要做什麽,比如說:如果某個條件成立,就進行某種處理;否則的話,就進行另一種處理。if語句的具體格式為“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時打印“涼風有信”的謎底
			System.out.println("涼風有信的謎底是“諷”");
		}
		if (seq == 2) { // 按2時打印“秋月無邊”的謎底
			System.out.println("秋月無邊的謎底是“二”");
		}

上面的代碼例子,目的是根據輸入的數字來顯示對應的謎底,當輸入數字1時,日誌打印“涼風有信”的謎底;當輸入數字2時,日誌打印“秋月無邊”的謎底。然而要是輸入其它數字,可就啥都沒打印,這樣未免太嚴格了,不如對於所有非1的數字,都自動轉成數字2得了。此時else分支派上用場了,凡是非1的數字,自動默認變為數字2。於是,補充了自動轉換數字的賦值代碼如下所示:

		if (seq == 1) {
			seq = 1;
		} else {
			seq = 2;
		}

以上的賦值轉換代碼,雖然實現的功能很簡單,但是足足占用了五行代碼,著實拖泥帶水。仔細分析它的代碼邏輯,其實包括了三個要素,其一為判斷條件,其二為條件滿足時的賦值,其三為條件不滿足時的賦值,因而Java引入了新的三元運算符“?:”加以優化。該運算符的完整形式為“式子A?式子B:式子C”,當式子A成立時,運算結果為B,否則運算結果為C。如此一來,先前的數值轉換代碼可以改寫成下面這樣:

		// A?B:C裏的問號加冒號構成了一個三元運算符,當式子A成立時,運算結果為B,否則(式子A不成立)結果為C
		seq = seq==1?1:2; // 等價於 seq = (seq==1)?1:2

改寫後的代碼僅有一行而已,盡管未出現if和else的身影,但它仍是一種從條件語句簡化來的條件運算符。
當然,運算符“?:”最終是為了得到條件判斷的運算結果,倘若業務邏輯並不要求返回什麽數值,而是要求執行某項動作(比如打印日誌),那麽這個三元運算符便不再使用了。例如,前面的文字猜謎遊戲,假設不需要對變量seq進行數值轉換,而是發現非1數字時直接打印“秋月無邊”的謎底,則應當書寫完整的if/else語句,不可也無法再套用運算符“?:”。此時修改後的代碼就變成下面這樣了:

		if (seq == 1) { // 條件式子為真時,進入if分支處理
			System.out.println("涼風有信的謎底是“諷”");
		} else { // 否則(條件式子為假),進入else分支處理
			System.out.println("秋月無邊的謎底是“二”");
		}

所以,三元運算符“?:”僅適用於需要返回計算結果的場合。

Java開發筆記(十六)非此即彼的條件分支