m47*_*47h 12 c++ conditional-operator
通过尝试,我开始知道有必要在cout语句中将括号放在条件运算符周围.这是一个小例子:
#include <iostream>
int main() {
int a = 5;
float b = (a!=0) ? 42.0f : -42.0f;
// works fine
std::cout << b << std::endl;
// works also fine
std::cout << ( (a != 0) ? 42.0f : -42.0f ) << std::endl;
// does not work fine
std::cout << (a != 0) ? 42.0f : -42.0f;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
42
42
1
Run Code Online (Sandbox Code Playgroud)
为什么这些括号必要?在两种情况下都知道条件运算符的结果类型,不是吗?
Edw*_*per 19
该?:
经营者具有比低优先级<<
操作.即,编译器将您的上一个语句解释为:
(std::cout << (a != 0)) ? 42.0f : -42.0f;
Run Code Online (Sandbox Code Playgroud)
这将首先将布尔值(a!=0)
传递给cout.然后,该表达式的结果(即对cout的引用)将被转换为适当的类型,以便在?:运算符中使用(即void*
:请参阅http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/),并且取决于该值是否为真(即,cout是否没有设置错误标志),它将获取值42或值-42.最后,它将抛弃该值(因为没有使用它).
因为<<
优先级高于?
.
有趣的运动:
float ftest = std::cout << (a != 0) ? 42.0f : -42.0f;
Run Code Online (Sandbox Code Playgroud)
拿那个,编码恐怖!
您的代码相当于:
if ( std::cout << (a != 0) )
42.0f;
else
-42.0f;
Run Code Online (Sandbox Code Playgroud)
输出1
是因为,好吧(a != 0) == true
;