警告:逗号的右侧操作数对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_operator
编辑:有效!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;
你会有所期望的效果。