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

时间:2017-06-19 07:59:52

标签: c++ c gcc

我需要您的帮助以获取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 <iostream>
#include <string>
#include <iostream>

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

3 个答案:

答案 0 :(得分:5)

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

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

您是不是要将!iIsOk写为循环中停止条件的一部分:

iLoop1< iLoopN && iIsOk

使用

切换

iLoop1++, iIsOk = !iIsOk

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

iLoop1++, iIsOk ^= true

答案 1 :(得分:2)

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

  

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

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

如上所述,正如tilz0RBathsheba中的其他答案所述,根据您的“具体”要求,该声明应为iIsOk = !iIsOk,但我建议将这是循环体中的最后一个语句,为了便于阅读。

答案 2 :(得分:0)

!iIsOk应为iIsOk = !iIsOk

如果C包含i++++i之类的运算符,那么您使用!iIsOk执行的操作不会执行任何操作。如果你想要结果,你必须在某个地方做出贡献。

否定变量,请使用iIsOk = !iIsOk;,您将获得所需的效果。