欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-08-12 10:18:31
前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向。在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Java编程中,利用if语句可判断接下来要做什么,比如说:如果某个条件成立,就进行某种处理;否则的话,就进 ......

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

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