Java开发笔记(十六)非此即彼的条件分支

前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向。在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在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("秋月无边的谜底是“二”");
		}

所以,三元运算符“?:”仅适用于需要返回计算结果的场合。

posted @ 2018-10-29 21:43  pinlantu  阅读(420)  评论(0编辑  收藏  举报