2017-04-06 57 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为空指针。您仍然可以使用早期版本以获得可读性