每当我看到人们使用三元运算符时,他们通常允许隐式转换为布尔值true或false检查,例如:
int a = 5;
return a ? true : false;
但是我听说在很多情况下很好的做法是明确的,例如检查指针是否为nullptr而不是隐式地进行布尔检查。考虑到这一点,我想做以下事情:
int* ptr = nullptr;
return ptr == nullptr ? 0 : 1;
这对我来说有点奇怪,并提出了一些关于它如何解析这个问题的问题。但我的主要问题是我需要在ptr == nullptr部分周围使用括号吗?如果不是必要的话那么我认为它有助于清晰起见?或者只是做得更好更简单:
return ptr ? 1 : 0;
感谢。
答案 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)
在第二个示例中,您不需要==
周围的括号。这是因为通过顺序或优先级,return ptr ? 1 : 0;
运算符高于三元运算符。不过,为了清楚起见,您可以添加它。
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
是否有空指针。您仍可以使用早期版本的可读性