1. 運算式 vs 敘述
在 Java 中,所有語句可分為兩類:敘述(Statement)與 運算式(Expression)。對敘述通常說它「被執行」,對運算式則說它「被計算」。但這不是重點。
主要差別在於:運算式有計算結果。這個結果首先有其型別,其次可以被指派到某處,或用在其他運算式中。
範例:
| 程式碼 | 說明 |
|---|---|
|
敘述 |
|
運算式,型別為 boolean |
|
運算式,型別與變數 i 的型別相同 |
|
運算式,型別與變數 x 的型別相同 |
這對我們有什麼幫助?
首先,我們可以利用許多敘述其實是運算式(有計算結果)這件事。例如,以下程式碼可以正常運作:
int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
其次,如果我們願意,也可以忽略運算式的計算結果。
console.nextLine(); // 忽略輸入結果
忽略計算結果在某些情況很有用:當該運算式除了結果之外還會做一些有意義的事,而我們在意的是那些動作,本身結果並不重要。
2. 三元運算子
這個技巧比前一個更有意思。Java 有一個特殊的三元(ternary)運算子。它有點像運算子 if–else 的簡寫:
條件 ? 運算式1 : 運算式2;
如果條件為真,則執行運算式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