C语言 这个逗号在for循环的test部分做什么?


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

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

语句

i < 5, i < c

使用逗号操作符,从左到右计算所有表达式,但只产生最右边的表达式的值。这意味着表达式i < 5被求值并被丢弃,而表达式i < c被求值并被循环实际使用。

我假设作者的意思是这样写的:

i < 5 && i < c

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

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

希望这对你有帮助!

这是一个逗号操作符。它计算左操作数和右操作数(总是按这个顺序),并产生右操作数的结果。如果要计算左操作数的副作用,那么使用它是有意义的;因为i < 5没有副作用,编译器会警告你。

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

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

很难猜测想要是什么。也许作者真正的意思是:

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

忽略i < 5

完整表达式为:

i < 5, i < c

由逗号操作符连接的两个独立表达式。

逗号操作符的工作原理是先求第一个表达式(i < 5),然后求第二个表达式(i < c),完整表达式取第二部分的值。

表达式的第一部分只有在有副作用时才重要。

它通常是这样使用的,并且是正确的:
<例子/em>

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

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

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

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

i < 5, i < c

实际上相当于

i < c

这是使用逗号操作符的结果。对左边的表达式求值,然后丢弃结果。然后对正确的表达式求值。逗号操作符的结果是正确表达式的结果。

因为左边的表达式(i < 5)是一个no-op,你得到了你所看到的警告。现在的问题是"作者的意图是什么?"如果没有更多的上下文,我们真的不能说,但它可能是其中之一:

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

这里,逗号操作符起作用。也就是说,它从左到右求值并返回最后一个表达式。因此计算i<5,计算i<c,但返回i<c结果作为其最后一个表达式。

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

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

相关内容

  • 没有找到相关文章