return 值和括号的三元运算符

Ternary operator for return values and brackets

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

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

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

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

这对我来说有点奇怪,并引发了一系列关于它是如何解析它的问题。但我的主要问题是 ptr == nullptr 部分是否需要括号?如果不是出于必要,那么我认为它有助于澄清?或者只是更好更简单地做:

return ptr ? 1 : 0;

谢谢。

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

周围加上括号

无论如何,直接与nullptr相比而不是强制转换为bool并没有任何具体的优势。有些人认为它是更好的风格,但实际上没有技术论证。如果你愿意,请随意忽略它。

如果您决定直接强制转换为 bool,写 !!a!!ptr 是惯用的;不需要条件表达式。

从句法的角度来说,

return ptr == nullptr ? 0 : 1;

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

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

好多了。 YMMV.

最易读和最惯用的方式是:

return ptr != nullptr;

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

  1. 第二个示例中不需要 ptr == nullptr 两边的括号。这是因为按顺序或优先级,== 运算符高于三元运算符。不过,为了清楚起见,您可以添加它。

  2. return ptr ? 1 : 0; 还将检查 ptr 是否存在空指针。您仍然可以使用早期版本以提高可读性