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,因此您不应该明确地写那个。
第二个示例中不需要 ptr == nullptr
两边的括号。这是因为按顺序或优先级,==
运算符高于三元运算符。不过,为了清楚起见,您可以添加它。
return ptr ? 1 : 0;
还将检查 ptr
是否存在空指针。您仍然可以使用早期版本以提高可读性
每当我看到人们使用三元运算符时,他们通常允许隐式转换为布尔值 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,因此您不应该明确地写那个。
第二个示例中不需要
ptr == nullptr
两边的括号。这是因为按顺序或优先级,==
运算符高于三元运算符。不过,为了清楚起见,您可以添加它。return ptr ? 1 : 0;
还将检查ptr
是否存在空指针。您仍然可以使用早期版本以提高可读性