【问题标题】:What does this comma do in the *test* portion of a for loop?这个逗号在 for 循环的 *test* 部分有什么作用?
【发布时间】:2023-04-11 08:04:02
【问题描述】:
int c = someIntegerValue;

// Some code...

int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}

我的编译器说error: expression has no effect,听起来很对。那么,这里将使用这两个比较中的哪一个?我的猜测是 i &lt; c 被忽略了,但我想从其他人那里得到一些确认,因为我还不能运行这段代码......

【问题讨论】:

  • 不是 C 专家,但它似乎正试图以一种奇怪的方式做相当于 i &lt; 5 &amp;&amp; i &lt; c 的事情,但我不完全确定。
  • 编译器的权利。 i &lt; 5这里是求值的,但是值没用就扔掉了,而且没有副作用,所以这个程序员明显是误会了什么。
  • 为什么反对票和接近票?逗号运算符并不是世界上最直观的东西。它让我大吃一惊,我已经编写 C 代码近 2 年了。

标签: c for-loop comma-operator


【解决方案1】:

声明

i < 5, i < c

使用comma operator,它从左到右计算所有表达式,但只产生最右边的值。这意味着表达式 i &lt; 5 被求值并被丢弃,而表达式 i &lt; c 被求值并被循环实际使用。

我假设作者打算写这样的东西:

i < 5 && i < c

实际上考虑了这两个表达式。

也就是说,我不确定为什么这是编译器错误而不是编译器警告。这是合法代码,尽管几乎可以肯定它是一个错误。也许您已将编译器设置为在警告时报告错误?

希望这会有所帮助!

【讨论】:

  • 我不会称之为“更好的方法来做到这一点”。 &amp;&amp; 的版本在语义上与逗号运算符的版本不同。 &amp;&amp; 版本很可能是作者的意思,但无法确定。
  • i &lt; 5 &amp;&amp; i &lt; ci &lt; 5 , i &lt; c 不一样。正确的表达方式取决于原作者想要实现的逻辑。
  • 我会接受的。谢谢大家!
  • 我相信i &lt; 5, i &lt; ci &lt; 5 将在我的编译器优化阶段被删除,因为它的 = 不是一个声明。
【解决方案2】:

这是使用逗号运算符的结果。对左表达式求值,然后丢弃结果。之后,评估正确的表达式。逗号运算符的结果是正确表达式的结果。

由于左侧表达式 (i &lt; 5) 是无操作的,因此您会收到所看到的警告。现在的问题是“作者的意图是什么?”如果没有更多的上下文,我们真的不能说,但它很可能是其中之一:

  i < 5
  i < c
  i < 5 && i < c

【讨论】:

    【解决方案3】:

    逗号运算符的结果是右操作数的值。

    这里的左操作数 (i &lt; 5) 没有副作用 所以

    i < 5, i < c
    

    实际上等价于

    i < c
    

    【讨论】:

      【解决方案4】:

      这是一个逗号运算符。它评估其左右操作数(始终按该顺序),并产生右操作数的结果。如果评估左操作数的副作用,则使用它是有意义的;因为i &lt; 5 没有副作用,你的编译器会警告你。

      被忽略的是i &lt; 5,而不是i &lt; c。代码相当于:

      for ( i = 0; i < c; i++ ) {
           ...
      }
      

      很难猜出它的意图是什么。也许作者的真正意思是:

      for ( i = 0; i < 5 && i < c; i++ ) {
          ...
      }
      

      【讨论】:

        【解决方案5】:

        这里, 逗号运算符起作用。意思是,它从左到右计算并返回最后一个表达式。所以i&lt;5 被评估,i&lt;c 被评估但返回i&lt;c 结果作为它的最后一个表达式。

        i &lt; 5, i &lt; c 完全没有意义。与i &lt; c 没有区别。

        根据作者的逻辑,这是一个错误。

        【讨论】:

          【解决方案6】:

          被忽略的是i &lt; 5

          完整的表达式是:

          i &lt; 5, i &lt; c

          comma-operator 连接的两个单独的表达式。

          逗号运算符的工作原理是先计算第一个表达式 (i &lt; 5),然后计算第二个表达式 (i &lt; c),整个表达式取第二部分的值。

          表达式的第一部分只有在它有副作用时才有意义。

          这是一种常见且正确的用法:
          示例

          for(i = 0, j = 10; i < 10; ++i, --j)
          /* i goes from 0-10, while j goes from 10-0 at the same time */
          

          但是按照你代码中显示的方式,它没有任何意义,只会让其他人感到困惑。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-09
            • 2020-10-03
            • 1970-01-01
            • 1970-01-01
            • 2014-08-17
            • 2013-12-13
            • 1970-01-01
            相关资源
            最近更新 更多