【发布时间】:2021-09-02 03:54:11
【问题描述】:
在调试别人的代码时,我遇到了如下形式的表达式:
auto result = value == bool_value? result_if_bool_value: result_if_not_bool_value
我对三元运算符很熟悉,但是我对上面语句中的双重相等运算符感到困惑。
具体来说,上面用if-else语句写的命令相当于什么?
【问题讨论】:
在调试别人的代码时,我遇到了如下形式的表达式:
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 在这里独立于条件进行评估,并且与仅初始化相比,有一个初始化和可能的一个赋值。我可以交换 @987654330 @ 和 result_if_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 比理解条件运算符更难。
【讨论】:
如果value == bool_value 的计算结果为true,则result 被分配result_if_bool_value 否则result 被初始化result_if_not_bool_value。
【讨论】:
result 已初始化,未分配