C 語言

條件(三元)運算子

有時你想根據一個是/否的問題在兩個值之間選擇,而且全部在一個小小的運算式裡完成——「測試通過就用這個,否則用那個」。條件運算子,以問號與冒號寫成,正是做這件事。它被稱為三元,因為它是 C 中唯一接受三個部分的運算子:一個測試、為真時的值、為假時的值。

形式是 condition ? value_if_true : value_if_false。C 先求值 condition;若它非零(真)整個運算式就成為 value_if_true、另一條臂不被求值;若它為零(假)運算式就成為 value_if_false、真的那條臂被跳過。所以「int max = (a > b) ? a : b;」讀作:若 a 大於 b,max 是 a,否則 max 是 b。因為它是一個產生值的運算式,你可以把它直接放進更大的運算式或指派裡,那是完整 if 述句放不進去的地方。

為什麼重要:三元運算子讓簡短的二選一保持精簡,避免只為了挑兩個值之一就寫四行 if/else。誠實的提醒是節制:把三元運算子層層巢狀很快會變得難讀,而當兩條分支是在做事(不只是挑一個值)時,普通的 if 述句更清楚。用它做簡單的值選擇,分支裡有真正的邏輯時就改用 if/else。

int a = 7, b = 4; int max = (a > b) ? a : b; /* max 變成 7 */ printf("%d apple%s\n", n, (n == 1) ? "" : "s");

三元運算子在行內挑出兩個值之一。只有被選中的那條臂被求值,所以未被選的那側永不執行。

只有被選中的分支會被求值,所以未被選那條臂裡的副作用永遠不會發生。深度巢狀的三元運算子會傷害可讀性——當每條分支在做真正的工作而非只挑一個值時,請優先用 if/else。

又稱
ternary operator?:三元運算子問號冒號運算子