警告:逗号的右侧操作数对gcc 4.4.7没有影响

在Linux gcc 4.4.7中,我需要您的帮助以获得以下警告

for (int iLoop1= 0; iLoop1< iLoopN; ++iLoop1, ++iLoop2, !iIsOk) 

我在最后一个逗号之后的最后一个参数中发出以下警告

 error: right-hand operand of comma has no effect 

我已经阅读了逗号运算符的wiki页面,但我不明白问题https://en.wikipedia.org/wiki/Comma_o​​perator

编辑:有效!iIsOk没有做任何我测试以下代码

 // Example program #include  #include  #include  int main() { int iIsOk = 0; for (int iLoop1 = 0; iLoop1 < 2; iLoop1++, !iIsOk) { std::cout << "IsOk=" << iIsOk << std::endl; } for (int iLoop1 = 0; iLoop1 < 2; iLoop1++, iIsOk = !iIsOk) { std::cout << "IsOk2=" << iIsOk << std::endl; } } 

输出:

 IsOk=0 IsOk=0 IsOk2=0 IsOk2=1 

!iIsOk虽然经过评估,但没有做任何事情; 即删除它将对程序完全没有影响。

您有用的编译器会警告您。

你的意思是写!iIsOk作为循环中停止条件的一部分:

iLoop1< iLoopN && iIsOk

或者使用它来切换

iLoop1++, iIsOk = !iIsOk

或更shiny(由于变量重复较少,我个人觉得更清楚)

iLoop1++, iIsOk ^= true

首先,让我告诉你警告信息背后的原因。 根据逗号运算符属性,从C11 ,章节§6.5.17( 强调我的

逗号运算符的左操作数被计算为void表达式; 它的评估与右操作数之间存在一个序列点。 然后评估右操作数; 结果有它的类型和价值。

所以,在这种情况下, 最终的 RHS操作数是.... , !iIsOk ,为此,生成的值未被使用。 因此警告。 您需要使用该值,或者您可以删除该语句,因为它在当前状态下,它对程序没有任何影响。

也就是说,正如tilz0R和Bathsheba在其他答案中所提到的,根据你的“特定”要求,语句应该是iIsOk = !iIsOk但是我建议把它作为循环体中的最后一个语句,因为为了便于阅读。

!iIsOk应该是iIsOk = !iIsOk

如果C有像i++++i这样的运算符,那么你做的事情就是!iIsOk什么都不做。 如果你想要结果,你必须在某个地方做出贡献。

否定变量,请使用iIsOk = !iIsOk; 你会有所期望的效果。