1. 表达式 vs 语句
在 Java 中,一切可分为两类:语句(Statement)和 表达式(Expression)。通常我们说语句会被执行,而表达式会被求值。不过这不是关键点。
语句与表达式的根本区别在于:表达式有求值结果。该结果首先有类型;其次,这个结果可以被赋值到某处,或者用于另一个表达式中。
示例:
| 代码 | 备注 |
|---|---|
|
语句 |
|
表达式,类型为 boolean |
|
表达式,类型与变量 i 的类型相同 |
|
表达式,类型与变量 x 的类型相同 |
那这对我们有什么用?
首先,我们可以利用这样一个事实:许多看似“语句”的东西其实也是表达式(有求值结果)。例如,下面的代码是可行的:
int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
其次,如果我们愿意,也可以忽略表达式的求值结果。
console.nextLine(); // 忽略输入的结果
当表达式除了返回结果之外还会产生某些有用的副作用,而我们只关心副作用、不关心结果时,就可以忽略该结果。
2. 三元运算符
这个小技巧比前一个更有意思。Java 提供了一个特殊的三元(即三目)运算符。它有点像 if–else 的简写:
Uslovie ? Vyrazhenie1 : Vyrazhenie2;
如果条件为真,则执行表达式1,否则执行表达式2。条件后面是问号,两个表达式之间用冒号分隔。
三元运算符与 if-else 的主要区别在于:三元运算符本身是一个表达式,因此它的结果可以被赋值。
例如,我们要计算两个数的最小值。使用三元运算符,代码如下:
int a = 2;
int b = 3;
int min = a < b ? a : b;
或者,假设你需要根据某个条件给变量赋不同的值,该怎么写?
方案一——使用 if-else:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
方案二——使用三元运算符,也就是 if-else 的简写:
int age = 25;
int money = age > 30 ? 100 : 50;
那么该用 if-else 还是三元运算符更好?从执行速度看,几乎没有区别。更重要的是代码的可读性——代码不仅要正确运行,还要便于他人阅读与维护。
一个简单的经验是:如果逻辑能写在一行——用三元运算符;如果一行放不下——更适合用 if-else。
3. 使用细节
值的类型
重要的是要记住:三元运算符的两个分支(<值_为真时> 和 <值_为假时>)要么类型相同,要么彼此兼容(例如两个都是 String,或两个都是 int)。
可行:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 两个分支都是 int
编译错误:
int a = 10, b = 20;
// String 和 int 不兼容
String result = (a > b) ? "更大" : 0; // 编译错误:不能将 int 赋给 String 类型的变量
正确写法:
int a = 10, b = 20;
String result = (a > b) ? "更大" : "小于或等于";
示例:处理数字
用三元运算符计算绝对值:
int number = -5;
int abs = (number >= 0) ? number : -number;
System.out.println(abs); // 5
4. 将三元运算符嵌入到应用中
我们来写一个简单的交互式应用:除了问候外,程序还会告诉用户明年几岁,并指出是否成年。
System.out.print("请输入你的名字:");
String name = console.nextLine();
System.out.print("请输入你的年龄:");
int age = console.nextInt();
int nextYear = age + 1;
String status = (nextYear >= 18) ? "已成年" : "未成年";
System.out.println("你好," + name + "!明年你将 " + nextYear + " 岁。你将是 " + status + "。");
细节说明:
变量 status 通过三元运算符计算:如果一年后年龄不少于 18,则用户将是成年人(或仍然是)。
5. 嵌套三元运算符——谨慎使用!
三元运算符可以相互嵌套(在每个分支里再放一个三元表达式)。但是……这通常会降低可读性,尤其是对后来阅读代码的人(哪怕是两天后的你)。
示例:按年龄划分类别
String category = (age < 7) ? "学龄前儿童" :
(age < 18) ? "中小学生" :
(age < 65) ? "成人" : "退休人员";
决策表:
| 年龄 | 条件 | 结果 |
|---|---|---|
| < 7 | |
学龄前儿童 |
| 7–17 | |
中小学生 |
| 18–64 | |
成人 |
| 65 及以上 | 否则 | 退休人员 |
这样的代码勉强还能读,但若逻辑更复杂——最好使用 if-else if-else。
6. 小技巧:三元运算符与 boolean 类型
有时会写出这样的表达式:
boolean adult = (age >= 18) ? true : false;
但这其实是多余的。表达式 (age >= 18) 本身就返回 boolean。因此可以简化为:
boolean adult = (age >= 18);
GO TO FULL VERSION