如果程序员希望在某个条件成立的情况下由表达式1给变量a赋值,而在条件不成立的情况下由表达式2给变量a赋值,就可以用if...else结构完成这个操作:
- if(条件){
- a = 表达式1;
- }else{
- a = 表达式2;
- }
其实,Java语言中有一个运算符也能实现与以上代码同样的效果,这个运算符就是条件运算符。条件运算符的写法是?:,它是Java语言中唯一一个三目运算符,需要三个操作数。条件运算符在程序中都是以如下格式出现:
条件?表达式1:表达式2
这个格式被称为条件表达式。在此格式中,问号前面的条件以及冒号两侧的表达式1和表达式2都是条件运算符的操作数。为了方便表述,把此格式中表达式1的运算结果称为“结果1”,把表达式2的运算结果称为“结果2”。
如果问号前面的条件成立,则以冒号左边的“结果1”作为条件表达式的最终运算结果,而条件不成立则以冒号右边的“结果2”作为条件表达式的最终运算结果。因此,使用条件表达式来实现本小节开头提到的编码需求,程序可以写为:
a = 条件?表达式1:表达式2;
不难看出,条件表达式就是一个简化版的if...else结构。之所以说它是“简化版”,不仅仅是因为它写法简单,同时也因为它能实现的功能也比if...else结构简单。if...else结构在条件成立或不成立的情况下,都可以执行很多复杂的操作。而条件表达式仅能根据条件是否成立在表达式1和2中完成“二选一”的操作,因此条件运算符不能完全代替if...else结构,它只是一个简化版的if...else。
使用条件表达式在很多情况下都可以简化代码的编写。下面就来看两个条件表达式的经典应用:
【例02_07 判断数字奇偶性】
Exam02_07.java
- import java.util.Scanner;
- public class Exam02_07 {
- public static void main(String[] args) {
- int x;
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入一个整数:");
- x = sc.nextInt();
- //使用条件运算符判断数字的奇偶性
- System.out.println("所输入整数" + x + "是" + (x % 2 == 0 ? "偶数" : "奇数"));// ①
- }
- }
在【例02_07】的语句①中,以“x%2==0”作为条件来判断变量x是否为偶数,程序运行结果如图2-13所示。

图2-13 【例02_07】运行结果
【例02_08 求绝对值】
Exam02_08.java
- import java.util.Scanner;
- public class Exam02_08 {
- public static void main(String[] args) {
- int x;
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入一个整数:");
- x = sc.nextInt();
- //使用条件运算符计算x的绝对值
- System.out.println(x + "的绝对值是" + (x >= 0 ? x : -x));// ①
- }
- }
在【例02_08】的语句①中,以“x>=0”作为判断条件,如果x为非负数,那么x的绝对值就是它自身,否则,x为负数,其绝对值为x的相反数,即-x,程序运行结果如图2-14所示。

图2-14 【例02_08】运行结果
通过以上两个例子不难看出,如果只是从两个表达式中进行“二选一”的操作,使用条件表达式要比if...else结构更加简洁。
初学Java的读者在使用条件运算符的时候还需要注意一个细节,那就是:一旦“结果1”和“结果2”的数据精度不同,则虚拟机会按照“向高看齐”的原则自动提升“结果1”与“结果2”中精度较低者的数据类型,例如:
- int x=4;
- System.out.println(x>4? 99.9+1 : 9+1);
在以上代码中,表达式1为“99.9+1”,因此“结果1”为double型数据。表达式2为“9+1”,因此“结果2”为int型。条件“x>4”不成立,所以条件表达式以“结果2”(也即10)作为最终运算结果。但相较于“结果1”而言,“结果2”精度的精度较低,此时虚拟机会按照“向高看齐”的原则,自动把原来“结果2”的值10从int型转换成double型,因此程序最终的输出结果为10.0,各位读者可以自行验证该结论的正确性。