【发布时间】: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