返回值和括号的三元运算符

时间:2017-04-06 04:31:38

标签: c++ ternary

每当我看到人们使用三元运算符时,他们通常允许隐式转换为布尔值true或false检查,例如:

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

但是我听说在很多情况下很好的做法是明确的,例如检查指针是否为nullptr而不是隐式地进行布尔检查。考虑到这一点,我想做以下事情:

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

这对我来说有点奇怪,并提出了一些关于它如何解析这个问题的问题。但我的主要问题是我需要在ptr == nullptr部分周围使用括号吗?如果不是必要的话那么我认为它有助于清晰起见?或者只是做得更好更简单:

return ptr ? 1 : 0;

感谢。

4 个答案:

答案 0 :(得分:4)

条件运算符的优先级低于后缀运算符,一元运算符,强制转换运算符,指向成员运算符,算术运算符,比较运算符,按位运算符和逻辑运算符。因此,ptr == nullptr周围不需要括号。

无论如何,直接与nullptr比较而不是强迫布尔没有任何具体的优势。有些人认为它是更好的风格,但实际上没有技术论据。如果你愿意,可以随意忽略它。

如果你决定直接胁迫bool,写!!a!!ptr是惯用的;不需要条件表达式。

答案 1 :(得分:3)

从句法的角度来看,

return ptr == nullptr ? 0 : 1;

完全没问题。从可读性的角度来看

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

好多了。 YMMV。

答案 2 :(得分:0)

最具可读性和惯用性的方式是:

return ptr != nullptr;

该语言已经保证该表达式的结果为1或0,因此您不应该明确地写出它。

答案 3 :(得分:0)

  1. 在第二个示例中,您不需要==周围的括号。这是因为通过顺序或优先级,return ptr ? 1 : 0;运算符高于三元运算符。不过,为了清楚起见,您可以添加它。

  2. ptr还会检查firstLabel=new JLabel(""+firstRand,SwingConstants.CENTER); firstLabel.setFont(font); top.add(firstLabel); secondLabel=new JLabel("",SwingConstants.CENTER); secondLabel.setFont(font); top.add(secondLabel); thirdLabel=new JLabel("",SwingConstants.CENTER); thirdLabel.setFont(font); top.add(thirdLabel); secondLabel=new JLabel("",SwingConstants.CENTER); // OOPS secondLabel.setFont(font); // OOPS top.add(secondLabel); // OOPS 是否有空指针。您仍可以使用早期版本的可读性