C/C++編程知識:運算符(七)丨三元/三目運算符知識詳解

 

 

預測如下C ++程序的輸出。ios

#include <iostream>編程

using namespace std;數組

int main()安全

{微信

   int test = 0;學習

   cout << "First  character "<< '1'<< endl;spa

   cout << "Second character "<< (test ? 3 : '1') << endl;視頻

   return 0;blog

}教程

有人但願兩個打印語句的輸出都同樣。可是,輸出將是

First  character 1

Second character 49

爲何第二個語句打印49?閱讀三元表達式。

 

三元運算符(C / C ++)

三元運算符的格式以下:

exp 1?exp 2:exp 3

表達式exp 1將始終被求值。exp 2和exp 3的執行取決於exp 1的結果。若是exp 1的結果非零,則將評估exp 2,不然將評估exp 3。

反作用:

exp 1的任何反作用都將在執行exp 2或exp 3以前當即進行評估和更新。換句話說,在三元表達式的條件評估以後存在一個序列點。若是exp 2或exp 3有反作用,則僅評估其中之一。

返回類型:

這是另外一個有趣的事實。三元運算符具備返回類型。返回類型取決於exp 2, 根據常規\重載轉換規則,exp 3可轉換爲exp 2。若是它們不可轉換,則編譯器將引起錯誤。請參閱如下示例,

如下程序編譯沒有任何錯誤。三元表達式的返回類型應爲float(如exp 2的返回類型),而exp 3(即字面 零-int類型)能夠隱式轉換爲float。

#include <iostream>

using namespace std;

int main()

{

   int test = 0;

   float fvalue = 3.111f;

   cout << (test ? fvalue : 0) << endl;

   return 0;

}

如下程序將沒法編譯,由於編譯器沒法找到三進製表達式的返回類型,或者在exp 2(char數組)和exp 3(int)之間不存在隱式轉換。

#include <iostream>

using namespace std;

int main()

{

   int test = 0;

   cout << test ? "A String": 0 << endl;

   return 0;

}

如下程序*可能*編譯,但在運行時失敗。三元表達式的返回類型綁定到類型(char *),可是表達式返回int,所以程序失敗。從字面上看,該程序嘗試在運行時在第0個地址打印字符串。

#include <iostream>

using namespace std;

int main()

{

   int test = 0;

   cout << (test ? "A String": 0) << endl;

   return 0;

}

咱們能夠觀察到將exp 2視爲輸出類型,而且exp 3將在運行時轉換爲exp 2。若是轉換是隱式的,則編譯器將插入存根進行轉換。若是轉換是顯式的,則編譯器將引起錯誤。若是有任何編譯器未捕獲到此類錯誤,則程序可能會在運行時失敗。

 

最佳實踐:

C ++類型系統的強大功能避免了此類錯誤。確保表達式exp 2和exp 3返回相同的類型或至少安全可轉換的類型。

但願對你有幫助~

另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這裏或許能夠幫到你~

C語言C++編程學習交流圈子,QQ羣1090842465點擊進入】微信公衆號:C語言編程學習基地

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!

編程學習書籍分享:

編程學習視頻分享:

相關文章
相關標籤/搜索