【问题标题】:warning: right-hand operand of comma has no effect gcc 4.4.7警告:逗号的右手操作数无效 gcc 4.4.7
【发布时间】:2017-06-19 07:59:52
【问题描述】:

对于 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

【问题讨论】:

  • 你打算用!iIsOk这个表达式达到什么目的?
  • 最后一个变量不应该是iAmOk吗?
  • i 表示 int ,我根据类型使用前缀

标签: c++ c gcc


【解决方案1】:

!iIsOk虽然被评估,但什么都不做;即删除它对程序绝对没有影响。

您的有用编译器正在警告您。

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

iLoop1&lt; iLoopN &amp;&amp; iIsOk

切换它使用

iLoop1++, iIsOk = !iIsOk

或者更炫的(我个人觉得更清晰,因为变量重复更少)

iLoop1++, iIsOk ^= true

【讨论】:

    【解决方案2】:

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

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

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

    也就是说,正如 tilz0RBathsheba 在其他答案中提到的那样,根据您的“特定”要求,声明应该是 iIsOk = !iIsOk,但我建议将其作为最后一个声明循环体,为了可读性。

    【讨论】:

      【解决方案3】:

      !iIsOk 应该是iIsOk = !iIsOk

      如果 C 有 i++++i 之类的运算符,那么您对 ​​!iIsOk 所做的事情将无济于事。如果你想要结果,你必须在某个地方进行评估。

      否定变量,使用iIsOk = !iIsOk;,你会得到想要的效果。

      【讨论】:

      • 哇...你是怎么得出这个结论的?你介意一点细节吗?
      • 因为 ++iLoop 在您的情况下与 iLoop = iLoop + 1 相同,因为 C 知道此运算符。另一方面,C 不知道!iLoop,结果必须分配到某个地方。
      • @SouravGhosh 我已经更新了答案。如果你不介意的话。
      • 不,分配不是任务,比较要么就行了。
      • @tilz0R 幸运的猜测。你仍然不应该只是猜测。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多