这个逗号在for循环的* test *部分中做了什么?

时间:2013-06-10 20:51:48

标签: c for-loop comma-operator

int c = someIntegerValue;

// Some code...

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

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

6 个答案:

答案 0 :(得分:14)

声明

i < 5, i < c

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

我认为作者打算写这样的东西:

i < 5 && i < c

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

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

希望这有帮助!

答案 1 :(得分:7)

这是逗号运算符。它评估其左右操作数(始终按此顺序),并产生右操作数的结果。如果对左操作数的副作用进行评估,则使用它是有意义的;由于i < 5没有副作用,因此编译器会向您发出警告。

忽略了i < 5,而不是i < c。代码相当于:

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

很难猜出的目标是什么。也许作者实际上意味着:

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

答案 2 :(得分:3)

忽略i < 5

完整的表达方式是:

i < 5, i < c

这是由comma-operator加入的两个单独的表达式。

逗号运算符的工作原理是评估第一个表达式(i < 5),然后是第二个表达式(i < 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 */

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

答案 3 :(得分:3)

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

这里左操作数(i < 5)没有副作用 所以

i < 5, i < c

实际上相当于

i < c

答案 4 :(得分:2)

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

由于左表达式(i < 5)是无操作,因此您会收到警告。现在的问题是“作者想要做什么?”没有更多的背景,我们不能说,但它可能是其中之一:

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

答案 5 :(得分:1)

此处,逗号运算符扮演一个角色。意味着,它从左到右进行评估并返回最后一个表达式。因此,i<5被评估,i<c被评估,但返回i<c结果作为其最后一个表达式。

i < 5, i < c完全没有意义。它与i < c没有区别。

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