三元運算子

罕見

基本定義

當你在網路上瀏覽其他人寫的 code 時,可能會看到一種包含 ?:,簡潔但是又很令人疑惑的語法,這就是所謂的三元運算子,大致的架構如下:

(條件) ? (條件為 true 時回傳的敘述) : (條件為 false 時回傳的敘述)

不過這邊要注意的是,(條件為 true 時回傳的敘述) 和 (條件為 false 時回傳的敘述) 的型態必須相同,否則會出現錯誤。

以我們前面曾舉過的程式碼為例:

int score;
cin >> score;
if (score >= 60) {
    cout << "Oh yes~";
} else {
    cout << "Oh no qwq...";
}

這時候你的code可以簡化成:

cout << ( score >= 60 ? "Oh yes~" : "Oh no qwq...");

這時候你的程式就會做跟上面原始程式碼一樣的事情,先去檢查分數有沒有大於等於 60 分,有的話就輸出夾在 ?: 中間的字串,否則就是 : 後面的。現在因為 code 都比較短,而且比較不會有冗餘的東西,所以比較難感受三元運算子的強大,但是當有天你定義變數或輸出時不想打很多個 if,那三元運算子將會發揮很大的功用。

例子們

以下是幾個好的例子:

  • 取最大值/最小值
cout << ( x > y ? x : y );
int max_num = ( x > y ? x : y );
  • 判斷奇偶數/正負數
cout << ( x % 2 ? "Odd" : "Even" );
// x % 2 == 1 => 是奇數,true
cout << ( x > 0 ? '+' : '-' );
// x > 0 => 是正,true(請先忽略等於0的情況)

接下來看看錯誤示範:

  • 論雙引號和單引號能差多少

一樣是正負數

cout << ( x > 0 ? "+" : '-' );
//  字元跟字串可是不一樣的啊
error: operands to ?: have different types 'const char*' and 'char'
     cout << ( x > 0 ? "+" : '-' );  
               ~~~~~~^~~~~~~~~~~     

打錯一個引號就會 CE!所以用三元運算子的時候還得小心謹慎才是!

小測驗

(a > b) ? a : b 的意思是什麼?