【问题标题】:C++ Ternary Operator with Equality Statement带有等式语句的 C++ 三元运算符
【发布时间】:2021-09-02 03:54:11
【问题描述】:

在调试别人的代码时,我遇到了如下形式的表达式:

auto result = value == bool_value? result_if_bool_value: result_if_not_bool_value

我对三元运算符很熟悉,但是我对上面语句中的双重相等运算符感到困惑。

具体来说,上面用if-else语句写的命令相当于什么?

【问题讨论】:

    标签: c++ conditional-operator


    【解决方案1】:

    条件运算符的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,但是条件需要被否定,这在一般情况下可能会导致不同的结果。虽然这只是超级防御,但当涉及的类型表现“正常”时,主要是风格问题.)

    【讨论】:

      【解决方案2】:

      声明

      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_valueresult_if_not_bool_value的常用类型。

      如果result_if_bool_valueresult_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;
      }
      

      【讨论】:

        【解决方案3】:

        完全等效的代码将是(C++17 以后)

        auto maker = [&](bool condition)
        {
             if ( condition )
                 return r1;
             else
                 return r2;
        };
        
        auto result = maker(value == bool_value);
        

        虽然可以提出一个很好的论点,即理解 lambda 和 RVO 比理解条件运算符更难。

        【讨论】:

          【解决方案4】:

          如果value == bool_value 的计算结果为true,则result 被分配result_if_bool_value 否则result 被初始化result_if_not_bool_value

          【讨论】:

          • result 已初始化,未分配
          猜你喜欢
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-16
          • 2013-02-13
          • 2015-10-13
          相关资源
          最近更新 更多