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


預(yù)測(cè)以下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;
}
有人希望兩個(gè)打印語(yǔ)句的輸出都一樣。但是,輸出將是
First ?character 1
Second character 49
為什么第二個(gè)語(yǔ)句打印49?閱讀三元表達(dá)式。

三元運(yùn)算符(C / C ++)
三元運(yùn)算符的格式如下:
exp?1?exp?2:exp?3
表達(dá)式exp?1將始終被求值。exp?2和exp?3的執(zhí)行取決于exp?1的結(jié)果。如果exp?1的結(jié)果非零,則將評(píng)估exp?2,否則將評(píng)估exp?3。
副作用:
exp?1的任何副作用都將在執(zhí)行exp?2或exp?3之前立即進(jìn)行評(píng)估和更新。換句話說(shuō),在三元表達(dá)式的條件評(píng)估之后存在一個(gè)序列點(diǎn)。如果exp?2或exp?3有副作用,則僅評(píng)估其中之一。
返回類型:
這是另一個(gè)有趣的事實(shí)。三元運(yùn)算符具有返回類型。返回類型取決于exp?2,?根據(jù)常規(guī)\重載轉(zhuǎn)換規(guī)則,exp?3可轉(zhuǎn)換為exp?2。如果它們不可轉(zhuǎn)換,則編譯器將引發(fā)錯(cuò)誤。請(qǐng)參閱以下示例,
以下程序編譯沒(méi)有任何錯(cuò)誤。三元表達(dá)式的返回類型應(yīng)為float(如exp?2的返回類型),而exp?3(即字面?零-int類型)可以隱式轉(zhuǎn)換為float。
#include <iostream>
using namespace std;
int main()
{
???int test = 0;
???float fvalue = 3.111f;
???cout << (test ? fvalue : 0) << endl;
?? return 0;
}
以下程序?qū)o(wú)法編譯,因?yàn)榫幾g器無(wú)法找到三進(jìn)制表達(dá)式的返回類型,或者在exp?2(char數(shù)組)和exp?3(int)之間不存在隱式轉(zhuǎn)換。
#include <iostream>
using namespace std;
int main()
{
???int test = 0;
???cout << test ? "A String": 0 << endl;
???return 0;
}
以下程序*可能*編譯,但在運(yùn)行時(shí)失敗。三元表達(dá)式的返回類型綁定到類型(char *),但是表達(dá)式返回int,因此程序失敗。從字面上看,該程序嘗試在運(yùn)行時(shí)在第0個(gè)地址打印字符串。
#include <iostream>
using namespace std;
int main()
{
???int test = 0;
???cout << (test ? "A String": 0) << endl;
???return 0;
}
我們可以觀察到將exp?2視為輸出類型,并且exp?3將在運(yùn)行時(shí)轉(zhuǎn)換為exp?2。如果轉(zhuǎn)換是隱式的,則編譯器將插入存根進(jìn)行轉(zhuǎn)換。如果轉(zhuǎn)換是顯式的,則編譯器將引發(fā)錯(cuò)誤。如果有任何編譯器未捕獲到此類錯(cuò)誤,則程序可能會(huì)在運(yùn)行時(shí)失敗。

最佳實(shí)踐:
C ++類型系統(tǒng)的強(qiáng)大功能避免了此類錯(cuò)誤。確保表達(dá)式exp?2和exp?3返回相同的類型或至少安全可轉(zhuǎn)換的類型。
希望對(duì)你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車(chē),快人一步!筆者這里或許可以幫到你~

UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書(shū)籍分享:

編程學(xué)習(xí)視頻分享:
