2017-04-06 18 views
2

每當我看到使用三元運算符,他們往往允許隱式轉換成布爾真或假支票的人,例如:的返回值和括號三元操作符

int a = 5; 
return a ? true : false; 

不過我聽說這是很好的做法在許多情況下是明確的,例如檢查指針是否爲nullptr而不是隱式地執行布爾檢查。考慮到這一點,我想做到以下幾點:

int* ptr = nullptr; 
return ptr == nullptr ? 0 : 1; 

這看起來有點怪我,提出了一堆它解析這個究竟如何的問題。但我的主要問題是我需要括號圍繞ptr == nullptr部分?如果沒有必要,那麼我認爲這有助於澄清?或者更好,更簡單:

return ptr ? 1 : 0; 

謝謝。

+1

您不需要'ptr == nullptr'周圍的括號。話雖如此,如果它可以幫助您更清晰地閱讀,請繼續並添加它。 –

+0

與運營商關鍵字標籤無關。 –

+0

我覺得別人編輯並添加了。謝謝你的幫助。 – Zebrafish

回答

4

條件運算符的優先級低於postfix運算符,一元運算符,強制運算符,指針對成員運算符,算術運算符,比較運算符,位運算符和邏輯運算符。因此,您不需要在ptr == nullptr附近使用括號。

無論如何,直接比較nullptr而不是強迫布爾沒有任何具體優勢。有些人認爲這是更好的風格,但實際上沒有這方面的技術論據。所以,如果你願意,可以隨意忽略它。

如果你決定強迫直接BOOL,寫!!a!!ptr是地道的;不需要條件表達式。

3

從一個句法點,

return ptr == nullptr ? 0 : 1; 

是完全沒有問題。從可讀性的角度來看

return (ptr == nullptr) ? 0 : 1; 

好得多。因人而異。

0

最可讀的和習慣的方法是:

return ptr != nullptr; 

語言已確保了該表達式的結果是1或0,所以你不應該寫明確。

+1

在C中,結果是「1」或「0」。在C++中,它是'true'或'false'。這裏的區別在於,在C中它的類型是'int',在C++中它的類型是'bool'。 –

0
  1. 在第二個示例中,不需要括號括在ptr == nullptr左右。這是因爲按順序或優先級,==運算符高於三元運算符。不過,您可以將其添加爲清晰。

  2. return ptr ? 1 : 0;也將檢查ptr爲空指針。您仍然可以使用早期版本以獲得可讀性