簡體   English   中英

c ++三元運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM