Java三目运算符
大 以 巴 狼 人气:01.什么是条件分支语句?条件分支语句共有几种写法?
条件分支语句就是根据条件不同,选择执行不同代码的结构,Java中共有三种声明条件分支语句的语法,分别为:
- if 语句
- 三目运算符
- switch语句
案例:判断输入的数值是奇数还是偶数,if 语句非常简单:
System.out.println("请输入一个数字:"); int num = sc.nextInt(); //输出用户输入的数据是奇数还是偶数? //分析:通过条件分支语句进行判断! if (num % 2 == 0) {//证明:数值除以二等于0,是偶数 System.out.println("偶数"); } else {//证明:除以2不等于0,是奇数 System.out.println("奇数"); }
2. 三目元算符又称为三元运算符也称为条件运算符,目的就是根据条件得到数据结果,语法结构:
判断条件 ?条件成立结果 :条件不成立结果
需要注意的是,三目运算符得到的是数据结果,不是代码表达式 。
- 优势:判断两种分支的代码非常简单
- 劣势:不太适用于判断多中分支(可以用来判断,需要通过三目元算符嵌套完成!)
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个数字:"); int num = sc.nextInt(); //输出用户输入的数据是奇数还是偶数? //分析:num对2取余是否等于0 ? (如果条件成立)输出偶数 :(如果不成立)输出奇数 System.out.println(num % 2 == 0 ? "偶数" : "奇数"); }
如果遇到判断三个数值大小,或者4个数值大小时候,就会非常麻烦
Scanner sc = new Scanner(System.in); System.out.println("请输入第1个整数:"); int a = sc.nextInt(); System.out.println("请输入第2个整数:"); int b = sc.nextInt(); System.out.println("请输入第3个整数:"); int c = sc.nextInt(); System.out.println("请输入第4个整数:"); int d = sc.nextInt(); //输出三个变量的最大值!(三目运算符) //a > b ? a : b等价于求得了a和b中的最大值! System.out.println((a > b ? a : b) > c ? (a > b ? a : b) : c); System.out.println(a > b ? (a > c ? a : c) : (b > c ? b : c)); //输出四个变量的最大值! System.out.println(a > b ? (a > c ? (a > d ? a : d) : (c > d ? c : d)) : (b > c ? (b > d ? b : d) : (c > d ? c : d)));
3. switch语句的语法结构如下:
switch (变量) {
case 值1:
满足变量等于值1运行的代码;
break;
case 值2:
满足变量等于值2运行的代码;
break;
case 值3:
满足变量等于值3运行的代码;
break;
default:
不满足以上任何情况运行的代码;
break;
}
break用在switch语句中表示结束当前switch语句的执行,如果省略break,那么switch语句会跳过后续所有判断继续执行,直到遇到break或者switch运行结束为止!
- 优势:适用于判断一个数的多种分支的情况
- 劣势:switch只能判断相等的情况
/* 周一:上班 周二:上班 周三:出差 周四:上班 周五:上班 周六:睡觉 周日:打球 否则:日期有误 */ Scanner sc = new Scanner(System.in); System.out.println("请输入今天周几?"); int week = sc.nextInt(); //根据周几输出不同的内容(switch语句) switch (week) { case 1: case 2://当前一个判断句没有break时,运行不会终止,(case=1245都会输出上班) case 4: case 5: System.out.println("上班"); break; case 3: System.out.println("出差"); break; case 6: System.out.println("睡觉"); break; case 7: System.out.println("打球"); break; default: System.out.println("日期有误"); break; }
补充:Java 三目运算符细节详解
短路问题
首先我们都知道Java中 && 和 || 的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的 i 仍然是1,因为后面的运算短路了,没有计算。
int i = 1; if (true || (i++) > 5) { System.out.println("test"); } System.out.println(i); // 1
回到三目运算符,三目运算符也会有短路效果吗?看下面的代码。
int i = 5; int j = true ? 1 : ++i; System.out.println(i); // 5
结果输出是 5 ,说明三目运算符也有类似逻辑运算符的短路问题,直接去 true 和 false 对应的地方取结果,不会计算另一部分,即使把代码写成下面这样结果一样,输出结果还是 5 ,不会因为顺序而改变。
int i = 5; int j = false ? ++i : 1; System.out.println(i); // 5
运算顺序问题
先看下面的代码。
int[] array = new int[5]; int i = 4; boolean flag = i++ > 4 ? true : false; System.out.println(flag); // false i = 4; int b = i++ > 3 ? array[i] : array[i];
我们知道 i++ 是先赋值再进行自加,所以 flag 的结果是 false 很好理解,但是下面 b 的结果会是多少呢?直接看运行结果。
false
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at A.main(A.java:16)
结果是抛出数组越界异常,结果说明在比较结束的时候,i 的值已经加了,即此时 i = 5 ,再去取数组的值的时候就会抛出数组越界异常,所以千万不要认为 i 值在整个表达式结束后才会增加。
包装类问题
在使用三目运算符处理包装类时,要注意 NPE 问题,看下面的代码。
int a = 5; Integer b = null; int c = true ? a : b; System.out.println(c); // 5
在这个例子中,会输出 5 ,没有什么问题,但是把代码稍微变一点,看下面的代码。
int a = 5; Integer b = null; int c = true ? b : a; System.out.println(c);
仅仅是将 a 和 b 交换了一下位置,运行就会报 NullPointerException ,这是为什么的。这也很好理解,当为 true 时,会选 b ,因为前面 c 是基本数据类型,所以这时包装类会自动拆箱,变成下面这样的代码,而 b 是 null ,所以会抛出 NullPointerException 异常。
int a = 5; Integer b = null; int c = true ? b.intValue() : a; System.out.println(c);
但是,将代码变成下面这样,按理说应该不会有什么问题,因为 c 是包装类型,可以接收 null ,但是运行时还是会发生 NullPointerException 异常。其实,当三目运算符的第二、第三个操作数分别为基本类型的包装类和基本数据类型时,并且选择了包装类那一项,则包装类会自动进行拆箱操作。即代码还是会进行拆箱操作,所以会发生 NullPointerException 异常,这点非常容易使人弄错。
int a = 5; Integer b = null; Integer c = true ? b : a; // 还是会变成Integer c = true ? b.intValue() : a; System.out.println(c);
总结
加载全部内容