具有相等语句的 C++ 三元运算符
C++ Ternary Operator with Equality Statement
在调试别人的代码时,我运行变成如下形式的表达式:
auto result = value == bool_value? result_if_bool_value: result_if_not_bool_value
我熟悉三元运算符,但我对上面语句中的双重相等运算符感到困惑。
具体来说,上面用 if-else 语句编写的命令等效于什么?
条件运算符 precedence 低于 ==
。因此,该行被解析为:
auto result = (value == bool_value ) ? result_if_bool_value: result_if_not_bool_value
正常
( condition ) ? expr_true : expr_false
一般情况下,条件运算符 不是 等同于 if
,但你会得到与
相同的结果
T result; // auto does not work here !!
if ( value == bool_value ) result = result_if_bool_value;
else result = result_if_not_bool_value;
或者如果你想保留 auto
:
auto result = result_if_not_bool_value;
if (value == bool_value) result = result_if_bool_value;
不过,根据所涉及的实际类型,这可能会做一些与原来完全不同的事情(result_if_not_bool_value
在这里独立于条件进行评估,并且与仅初始化相比,有一个初始化和可能的一个赋值。我可以将 result_if_not_bool_value
与 result_if_bool_value
交换,但随后需要否定条件,这在所有普遍性中可能会导致不同的结果。虽然这只是超级防御,但当涉及的类型表现“正常”时,主要是风格问题。)
如果 value == bool_value
计算为 true
,result
被赋值 result_if_bool_value
否则 result
被初始化 result_if_not_bool_value
。
声明
auto result = value == bool_value? result_if_bool_value : result_if_not_bool_value;
分组为
auto result = ((value == bool_value) ? result_if_bool_value : result_if_not_bool_value);
由于您使用了 auto
,我无法简单地将其重新表述为等效的 if
语句。三元条件表达式的类型是result_if_bool_value
和result_if_not_bool_value
.
的普通类型
如果 result_if_bool_value
和 result_if_not_bool_value
的类型是 T
,并且 T
有一个赋值运算符,那么等效的 if
块将是
T result;
if (value == bool_value){
result = result_if_bool_value;
} else {
result = result_if_not_bool_value;
}
完全等效的代码是(C++17 以后)
auto maker = [&](bool condition)
{
if ( condition )
return r1;
else
return r2;
};
auto result = maker(value == bool_value);
尽管可以提出一个很好的论据,即理解 lambda 和 RVO 比理解条件运算符更难。
在调试别人的代码时,我运行变成如下形式的表达式:
auto result = value == bool_value? result_if_bool_value: result_if_not_bool_value
我熟悉三元运算符,但我对上面语句中的双重相等运算符感到困惑。
具体来说,上面用 if-else 语句编写的命令等效于什么?
条件运算符 precedence 低于 ==
。因此,该行被解析为:
auto result = (value == bool_value ) ? result_if_bool_value: result_if_not_bool_value
正常
( condition ) ? expr_true : expr_false
一般情况下,条件运算符 不是 等同于 if
,但你会得到与
T result; // auto does not work here !!
if ( value == bool_value ) result = result_if_bool_value;
else result = result_if_not_bool_value;
或者如果你想保留 auto
:
auto result = result_if_not_bool_value;
if (value == bool_value) result = result_if_bool_value;
不过,根据所涉及的实际类型,这可能会做一些与原来完全不同的事情(result_if_not_bool_value
在这里独立于条件进行评估,并且与仅初始化相比,有一个初始化和可能的一个赋值。我可以将 result_if_not_bool_value
与 result_if_bool_value
交换,但随后需要否定条件,这在所有普遍性中可能会导致不同的结果。虽然这只是超级防御,但当涉及的类型表现“正常”时,主要是风格问题。)
如果 value == bool_value
计算为 true
,result
被赋值 result_if_bool_value
否则 result
被初始化 result_if_not_bool_value
。
声明
auto result = value == bool_value? result_if_bool_value : result_if_not_bool_value;
分组为
auto result = ((value == bool_value) ? result_if_bool_value : result_if_not_bool_value);
由于您使用了 auto
,我无法简单地将其重新表述为等效的 if
语句。三元条件表达式的类型是result_if_bool_value
和result_if_not_bool_value
.
如果 result_if_bool_value
和 result_if_not_bool_value
的类型是 T
,并且 T
有一个赋值运算符,那么等效的 if
块将是
T result;
if (value == bool_value){
result = result_if_bool_value;
} else {
result = result_if_not_bool_value;
}
完全等效的代码是(C++17 以后)
auto maker = [&](bool condition)
{
if ( condition )
return r1;
else
return r2;
};
auto result = maker(value == bool_value);
尽管可以提出一个很好的论据,即理解 lambda 和 RVO 比理解条件运算符更难。