預測以下C 程序的輸出。
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << "First character "<< '1'<< endl;
cout << "Second character "<< (test ? 3 : '1') << endl;
return 0;
}
有人希望兩個打印語句的輸出都一樣。但是,輸出将是
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 編程學習交流圈子,點擊下方【了解更多】獲取更多學習資料幫助你學習成長~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!