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

新手上路,请多包涵

通过尝试,我知道有必要在 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

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

原文由 m47h 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

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

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

原文由 Edward Loper 发布,翻译遵循 CC BY-SA 4.0 许可协议

因为 << 的优先级高于 ?

趣味运动:

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

拿那个,编码恐怖!

您的代码相当于:

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

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

原文由 Luchian Grigore 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题