【问题标题】:Conditional operator used in cout statementcout 语句中使用的条件运算符
【发布时间】:2012-03-26 00:57:50
【问题描述】:

通过尝试,我了解到有必要在 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

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

【问题讨论】:

    标签: c++ conditional-operator


    【解决方案1】:

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

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

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

    【讨论】:

    • 请注意,cout&lt;&lt; 返回cout,与有效状态无关。将设置 failbit/badbit,但 (std::cout &lt;&lt; (a != 0)) 始终返回对 std::cout 的引用。 -42.0f 永远不应该被返回,因为该引用应该总是布尔评估为真。
    • @SamDeHaan:是的。抱歉,我的解释可能有点草率。表达式“coutcplusplus.com/reference/iostream/ios/operator_voidpt>
    • 然后我试着再次听起来很聪明。感谢您对我的更正的更正。 :)
    • 从C++11开始,不是operator void*,而是explicit operator boolen.cppreference.com/w/cpp/io/basic_ios/operator_bool
    【解决方案2】:

    因为&lt;&lt; 的优先级高于?

    有趣的练习:

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

    接受吧,编码恐怖!!!

    您的代码相当于:

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 2013-07-28
      • 2011-02-18
      • 2023-04-05
      • 1970-01-01
      • 2023-03-10
      • 2013-02-16
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多