zoukankan      html  css  js  c++  java
  • 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("秋月无边的谜底是“二”");
    		}
    

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

  • 相关阅读:
    label 选择: soft label or hard label?
    预训练模型 | MASS:更适合seq2seq类任务
    文本相似度计算/文本比较算法
    论文阅读 | Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment
    论文阅读 | Lite Transformer with Long-Short Range Attention
    预训练模型 | ELECTRA: Efficiently Learning an Encoder that Classifies Token Replacements Accurately
    Transformer 及其家族( Transformer-XL, Reformer... )
    java线程池01-ThreadPoolExecutor构造方法参数的使用规则
    快速排序算法
    mysql(4)—— 表连接查询与where后使用子查询的性能分析。
  • 原文地址:https://www.cnblogs.com/pinlantu/p/9873510.html
Copyright © 2011-2022 走看看