【问题标题】:Why does this code produce a warning referring to the comma operator?为什么此代码会产生引用逗号运算符的警告?
【发布时间】:2011-08-05 15:43:44
【问题描述】:

在回复this question时,我遇到了这段代码……

#include <iostream>

int main()
{
    int const income = 0;
    std::cout << "I'm sorry your income is: " < income;    // this is line 6
}

...其中包含一个错字。第 6 行的第二个(预期的)&lt;&lt; 运算符被意外写为&lt;

除此之外,编译代码 using GCC 4.3.4 或 4.4.3 会导致警告:

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

我的问题:为什么会产生那个特定的警告?它指的是哪个逗号运算符?

注意:我并不是提倡在 cout 声明中故意使用单个 &lt; 我只是在试图找出另一个问题的答案时偶然发现了这个警告“我”已经链接到,并且很好奇为什么编译器会生成它。

【问题讨论】:

  • 您确定您发布了正确的代码吗?我得到:`warning C4552: '
  • 是的,那是真正的代码 - 请参阅我在 IDEOne 上添加到示例的超链接。另请参阅其他问题,其他人也看到过类似的行为。
  • 你可以使用:void * v() { return 0; } ... v() &lt; 0; 来生成这个 - 我会说这是 gcc 中的一个错误。
  • 在@Tim 的反馈后改写了问题

标签: c++ cout comma-operator


【解决方案1】:

我认为他们只是忘记更改警告文本

int main() {
   1, 2;
}

prog.cpp:2: warning: left-hand operand of comma has no effect
prog.cpp:2: warning: right-hand operand of comma has no effect

expr, expr 运算符计算左操作数,然后计算右操作数并产生右操作数的计算结果。如果正确的操作数没有作用并且它的值没有被使用,它可能是程序中的一个错误。

现在他们似乎只是滥用上述警告文本来警告其他二元运算符。

【讨论】:

  • 看起来他们修好了。 @Xeo 已经证明它不会在 GCC 4.5.1 中生成警告 - 请参阅他的 C++0x IDEOne link
  • 虽然 Xeo 也指出,但您认为 4.5.1 仍会产生类似于 VC2010 中看到的警告。
【解决方案2】:

使用 MSVC2010,您给定的程序不会为我产生该警告,它只会产生

警告 C4552: '

因为那应该是&lt;&lt;income; 之前。 (注意:Ideone 根本不会产生警告。)

【讨论】:

  • @Xeo - 是的,对不起,我已经添加了上下文
  • @razlebe:好的,那么&lt; 就没有问题了。但是代码仍然无法在 VC10 和 Ideone 上产生上述警告。
  • @Xeo - 谢谢 - 也许这是一个 GCC 错误。
  • @Xeo 您的 IDEOne 超链接使用的是 C++0x (GCC 4.5.1) 而不是 4.3.4。同样,也许这是一个 gcc 错误(他们已在更高版本中修复)。
  • @razlebe:你说得对,Ideone 上的 4.3.4 会产生该错误 - 似乎@Johannes 是对的,他们忘记更改文本.. 不过没有解释,为什么 4.5.1甚至不再产生警告......
猜你喜欢
  • 2021-06-13
  • 2011-01-16
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多