cout语句中使用的条件运算符

时间:2012-03-08 14:44:58

标签: 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;
}

输出结果为:

42
42
1

为什么这些括号必要?在两种情况下都知道条件运算符的结果类型,不是吗?

2 个答案:

答案 0 :(得分:17)

?:运算符的优先级低于<<运算符。即,编译器将您的上一个语句解释为:

(std::cout << (a != 0)) ? 42.0f : -42.0f;

首先将(a!=0)的布尔值流式传输到cout。然后该表达式的结果(即对cout的引用)将被转换为适当的类型以在?:运算符中使用(即void*:请参阅http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/),并取决于该值是否为是真的(即,cout是否没有设置错误标志),它将获取值42或值-42。最后,它将抛弃该值(因为没有使用它)。

答案 1 :(得分:5)

因为<<的优先级高于?

有趣的运动:

float ftest = std::cout << (a != 0) ? 42.0f : -42.0f;

拿那个,编码恐怖!!!

您的代码相当于:

if ( std::cout << (a != 0) )
     42.0f;
else
    -42.0f;

它会输出1,因为(a != 0) == true;