条件运算符中的运算符优先级
Operator Precedence in Conditional Operator
所以我最近在试验一些模板,这是我偶然发现的代码:
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;
}
所以它基本上是一堆条件运算符,如果为真,则 return 一个值,如果为假,则根本 none 。如果将它们加在一起,则可以确定参数是什么数据类型。
但是,我意识到了一些事情。括号重要吗?我试过像这样在代码周围加上方括号:
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));
}
所以在某种程度上,它首先评估最后一个条件运算符,然后向后运行。但是我还是想不通,也不知道自己理解的对不对。
谁能告诉我这里的运算符优先级是什么,它是如何执行的?谢谢
是的,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 ) );
bool
的结果为 1
,char
的结果为 2
,int
的结果为 3
。
关于0 + std::is_same<T, ...>::value
,std::is_same<T, ...>::value
是一个bool
,作为operator+
的操作数时,会隐式转换为int
1
true
,0
false
。之后,将加法结果用作条件,并将 bool
转换回 0
的 false
和非零的 true
。
所以我最近在试验一些模板,这是我偶然发现的代码:
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;
}
所以它基本上是一堆条件运算符,如果为真,则 return 一个值,如果为假,则根本 none 。如果将它们加在一起,则可以确定参数是什么数据类型。
但是,我意识到了一些事情。括号重要吗?我试过像这样在代码周围加上方括号:
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));
}
所以在某种程度上,它首先评估最后一个条件运算符,然后向后运行。但是我还是想不通,也不知道自己理解的对不对。
谁能告诉我这里的运算符优先级是什么,它是如何执行的?谢谢
是的,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 ) );
bool
的结果为 1
,char
的结果为 2
,int
的结果为 3
。
关于0 + std::is_same<T, ...>::value
,std::is_same<T, ...>::value
是一个bool
,作为operator+
的操作数时,会隐式转换为int
1
true
,0
false
。之后,将加法结果用作条件,并将 bool
转换回 0
的 false
和非零的 true
。