【问题标题】:Typo with "cout < myint". Why does it work?用“cout < myint”打错字。为什么它有效?
【发布时间】:2011-08-05 15:10:35
【问题描述】:

我有这个代码,我搜索了几个小时为什么它无法打印我的收入

int const income = 0;
std::cout << "I'm sorry, your income is: " < income;

直到我发现我错过了写&lt;&lt; 但写了&lt;。为什么编译器没有检测到这一点并出错?我不确定为什么比较 cout 有意义?

【问题讨论】:

  • 也许ostream&amp; 会自动转换为int?它是哪个编译器?
  • @RedX 我在 GCC、clang 和 comeau online 上编译过。
  • 用户收入是整数常量表达式,值为0?那么,短期内欧元区经济复苏的希望不大?

标签: c++ iostream


【解决方案1】:

整数常量 0 也是一个空指针常量 - 它可以与ostreamoperator void * 的结果进行比较。请注意,如果常量的值不是 0,它将失败。

【讨论】:

  • +1:这完全正确。去掉const,编译失败。
  • 没错,如果将 0 更改为其他数字,编译器会报错。对于 0 是异常,能够将指针与 NULL 进行比较(gcc 将 NULL 定义为整数)。
  • 这也很容易用 int const foo = 0; void * v = foo; 演示,它只适用于值为 0 的 const int
  • 你是对的。虽然我担心术语“空指针”/(“空指针”?),0 确实不是。大多数人可能会隐含地认为您的意思是“空指针常量”,尽管有些人(比如我)仍然会感到困惑。
  • @Johannes Schaub - litb:编辑为“空指针常量” - 这是标准中使用的术语。
【解决方案2】:

    ​bool T::operator <(const T& b) const;

所以我猜编译器将参数转换为这个实例的类型。 您是否启用了所有警告,例如 -Wall

【讨论】:

    【解决方案3】:

    它使用 g++ 4.4.3 编译

    #include  <iostream>
    
    int main (void)
    {
       int const income = 0;
       std::cout << "I'm sorry, your income is: " < income;
    }
    

    但是,当使用 -Wall 运行它时(很好的做法!),我收到了一条有趣的消息:

    :~/stack$ g++ test.cpp -o temp
    :~/stack$ g++ -Wall test.cpp -o temp
    test.cpp: In function 'int main()':
    test.cpp:5: warning: right-hand operand of comma has no effect
    

    不知道它实际上做了什么(或试图做什么)......

    【讨论】:

      【解决方案4】:

      当我compile this code using GCC 4.3.4 时,我看到一个警告:

      prog.cpp: In function ‘int main()’:
      prog.cpp:6: warning: right-hand operand of comma has no effect
      

      ...虽然为什么它是警告而不是错误,但我不知道。

      编辑:事实上,我也不知道它指的是哪个逗号,因为这段代码:

      int const income = 0;
      std::cout << "I'm sorry your income is: " < income;
      

      ...生成相同的警告(请参阅here)。

      【讨论】:

      • 这实际上是一种奇怪的误导。 clang++ 至少可以说表达式... &lt; ... 的结果未被使用。
      • 逗号在哪里?它是否解析字符串并找到“你的收入是:”作为右手操作数?
      • 不,我不认为是这样 - take a look 在这个版本中。我不知道它指的是哪个逗号。一个奇怪的警告。
      • @litb 我问过separate question re:逗号操作数警告。
      • 对于任何可能感兴趣的人,看来此警告是由 GCC 4.3.4 中的错误产生的。 GCC 4.5.1 不会产生警告。
      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2013-07-11
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多