預測如下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?閱讀三元表達式。
三元運算符的格式以下:
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語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍分享:
編程學習視頻分享: