【问题标题】:Operator Precedence in Conditional Operator条件运算符中的运算符优先级
【发布时间】:2020-08-22 04:55:00
【问题描述】:

所以我最近在试验一些模板,这是我偶然发现的代码:

template <typename T>
int someFunction(T someParameter)
{
    return  std::is_same<T, bool>::value ? 1 : 0 +
            std::is_same<T, char>::value ? 2 : 0 +
            std::is_same<T, int>::value  ? 3 : 0;
}

所以它基本上是一堆条件运算符,如果为 true,则返回一个值,如果为 false,则根本不返回值。如果你把它们加在一起,你可以确定参数是什么数据类型。

但是,我意识到了一些事情。括号重要吗?我试着像这样在代码周围加上括号:

template <typename T>
int someFunction(T someParameter)
{
    return  (std::is_same<T, bool>::value ? 1 : 0) +
            (std::is_same<T, char>::value ? 2 : 0) +
            (std::is_same<T, int>::value  ? 3 : 0);
}

但是输出还是一样的。所以我在想也许编译器会看到这样的东西:

template <typename T>
int someFunction(T someParameter)
{
    return  std::is_same<T, bool>::value ? 1 : (0 +
            std::is_same<T, char>::value ? 2 : (0 +
            std::is_same<T, int>::value  ? 3 : 0));
}

所以在某种程度上,它首先评估最后一个条件运算符,然后向后工作。但是我仍然无法理解这件事,我不确定我是否理解正确。

谁能告诉我这里的运算符优先级是什么,以及它是如何执行的?谢谢。

【问题讨论】:

  • 对于包含运算符优先级表的每种语言都有参考。
  • 我知道,但我对这个特定示例的运算符优先级感到困惑
  • @chris C++ 有语言语法,而不是优先规则。任何优先表都是语法规则的总结,尽管在条件运算符的情况下它不是一个完美的总结
  • @M.M,尽管是对语言实际工作方式的抽象,但它仍然提供了所需的信息。该问题直接问“这里的运算符优先级是什么”,而那部分在优先级表中有直接答案:+ 高于?:。寻找这样的表是回答该部分的快速方法,无论是否使用 C++。
  • “幸运的是”对于作者来说,两种解释都给出了相同的结果:只有一个条件是true,在条件或最终结果中添加 0 不会改变任何内容。

标签: c++ operator-precedence conditional-operator


【解决方案1】:

是的,operator+precedence 比条件运算符高,所以

return  std::is_same<T, bool>::value ? 1 : 0 +
        std::is_same<T, char>::value ? 2 : 0 +
        std::is_same<T, int>::value  ? 3 : 0;

被解释为

return  std::is_same<T, bool>::value ? 1 : 
          ( 0 + std::is_same<T, char>::value ) ? 2 : 
            ( 0 + std::is_same<T, int>::value ) ? 3 : 0;

更清楚

return  std::is_same<T, bool>::value ? 1 : 
          ( ( 0 + std::is_same<T, char>::value ) ? 2 : 
            ( ( 0 + std::is_same<T, int>::value ) ? 3 : 0 ) );

它会给出1 对应bool 的结果,2 对应char3 对应int

关于0 + std::is_same&lt;T, ...&gt;::valuestd::is_same&lt;T, ...&gt;::valuebool,当用作operator+的操作数时,它会隐式转换为int,如1对于true0对于false。之后,将相加结果用作条件并转换为bool 回为false0true 为非零。

【讨论】:

  • ( 0 + std::is_same&lt;T, int&gt;::value ) 是如何工作的? std::is_same 不会返回值吗?
  • @DynamicSquid, std::is_same&lt;...&gt;::value 是一个整数值。当您使用纯 std::is_same&lt;...&gt;{} 时,还会转换为所述整数值。
  • @DynamicSquid 答案已修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2012-12-09
  • 2014-03-25
  • 2021-10-25
  • 2015-03-20
相关资源
最近更新 更多