關於 C/C++ 三元運算子的一些有趣觀察


我們知道三元運算子是用來代替 if..else 語句的。它由 ?: 表示。'?' 符號相當於 if 部分,':' 符號相當於 else 部分。以下 3 個程式解釋了三元運算子的一些有趣觀察。

以下程式能夠編譯透過,沒有任何錯誤。三元表示式的返回值型別期望為 float(與 exp2 相同),而 exp3(即字面量零 - int 型別)能夠隱式轉換為 float。

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   float fvalue = 3.111f;
   cout<< (test1 ? fvalue : 0) << endl;
   return 0;
}

以下程式將無法編譯,原因是編譯器無法找到三元表示式的返回值型別,或者 exp2(字元陣列)和 exp3(int)之間不存在隱式轉換。

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout<< test1 ? "A String" : 0 << endl;
   return 0;
}

以下程式可能會編譯透過,但也可能在執行時失敗。三元表示式的返回值型別限制為(char *)型別,但表示式返回 int,因此程式失敗。直白地說,程式在執行時嘗試列印第 0 個地址處的字串。

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout << (test1 ? "A String" : 0) << endl;
   return 0;
}

我們可以觀察到 exp2 被視為輸出型別,而 exp3 將能夠在執行時轉換為 exp2。如果轉換被視為隱式轉換,則編譯器會插入轉換存根。如果轉換被視為顯式轉換,則編譯器會丟擲錯誤。如果任何編譯器都無法捕獲此類錯誤,則程式可能會在執行時失敗。

更新於: 2020年1月29日

248 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.