警告:逗号的右侧操作数对 GCC 4.4.7 无效

warning: right-hand operand of comma has no effect gcc 4.4.7

本文关键字:GCC 无效 操作数 警告      更新时间:2023-10-16

我需要您的帮助才能在Linux gcc 4.4.7中出现以下警告

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

我有以下警告来自最后一个逗号之后的最后一个参数

error: right-hand operand of comma has no effect

我已经阅读了逗号运算符的维基页面,但我不明白这个问题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

!iIsOk虽然经过评估,但不会执行任何操作;即删除它对程序绝对没有影响。

有用的编译器会警告您这一点。

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

iLoop1< iLoopN && iIsOk

或使用

iLoop1++, iIsOk = !iIsOk

或更华丽(我个人觉得更清晰,因为变量重复更少(

iLoop1++, iIsOk ^= true

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

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

所以,在这里,在你的

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

也就是说,正如tilz0R和Bathsheba的其他答案中提到的,根据您的"特定"要求,该语句应该是iIsOk = !iIsOk但是为了可读性,我建议将其作为循环体中的最后一个语句。

!iIsOk应该iIsOk = !iIsOk

如果 C 有像 i++++i 这样的运算符,你用 !iIsOk 做的事情什么也没做。如果你想要结果,你必须在某个地方断言它。

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