[英]c++ ternary operator
所以我遇到了一些有趣的東西,我沒有意識到三元運算符(至少在Visual C ++ 98-2010中)。 正如在http://msdn.microsoft.com/en-us/library/e4213hs1(VS.71).aspx中指出的那樣,如果表達式和條件表達式都是l值,則結果是l值。
當然通常在c / c ++中你會寫一些類似的東西:
int value = (x == 1) ? 1 : 0;
甚至從不關心r值/ l值的影響,在這種情況下,1和0都不能轉換為l值。
但是,請采取以下措施:
int value = (x == 1) ? y : z;
y和z都是l值,它們,或者更准確地說,其中一個是三元運算符的實際結果(不是它的存儲值),這不一定是顯而易見的(至少我從來沒有考慮過任何長度) )。
但是,這導致了編寫以下內容的能力
(x == 1 ? y : z) = 99;
如果x = = 1,則將99分配給y,如果x!= 1,則分配99到z
我從未見過在任何地方和我所讀過的關於使用(或通常是否使用)三元運算符的所有討論中所描述的內容。
當然,只有表達式和條件表達式都是l值時,它才有效
(x == 1 ? 0 : z) = 99;
無法編譯,因為0是編譯器愉快地指出的r值。
這只適用於包括括號的情況
x == 1 ? y : z = 99;
是完全不同的東西,只有當(x!= 1)並且美麗的部分是雙方仍然是l值時才將99分配給z,所以有很多類似的東西(x == 1 ? y : z = 99) = 100
do(它根據x == 1的真值分配100到y或z,如果x == 1為假,則踩z = 99賦值)
所以,這引出了我的問題:
A)這部分是實際的c ++標准(看起來會是這樣)而不僅僅是微軟的東西 - 我看過但是到目前為止卻找不到這個信息。
B)如果這被廣泛認識並且我一直生活在搖滾之下? 我從來沒有在任何我能記得的代碼中看到過它,並且在討論三元運算符時從未見過它。
C)我需要更頻繁地出去嗎?
A)是的,這是標准的一部分。
B)它沒有被廣泛認識,盡管它可能在這里。 有一個原因,它被選為C ++的第一隱藏功能:C ++的隱藏功能? 。
C)沒有評論。 :)
就個人而言,我建議轉向使用此功能。 它比使用if
/ else
語句更不直觀,顯然不是每個人都知道它。
反對我自己的警告,我實際上嘗試在個人項目中使用這一次,我因為錯過了括號而浪費了30分鍾,試圖找到錯誤。
答:是的。 §[expr.cond] / 4:
如果第二個和第三個操作數是左值並且具有相同的類型,則結果是該類型並且是左值...
(請注意,在C語言中並非如此。在C99標准中明確寫入,腳注93,“條件表達式不會產生左值。”)
B.我不認為它被廣泛使用,因為用法非常模糊。 它更常見
if (x == 1)
y = 99;
else
z = 99;
您從未見過它,因為這種用法不像最常見的那樣直觀和可讀。 我也從未在生產代碼中看到過這種方式,我希望我從未見過它。
記住Herb Sutter和Andrei Alexandrescu的C ++編碼標准 ,規則6:“正確,簡單,清晰是第一位的。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.