5
int c = someIntegerValue;

// Some code...

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

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

4

6 回答 6

14

该声明

i < 5, i < c

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

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

i < 5 && i < c

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

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

希望这可以帮助!

于 2013-06-10T20:53:46.143 回答
7

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

是的i < 5,而不是i < c被忽略的。代码等价于:

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

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

for ( i = 0; i < 5 && i < c; i++ ) {
    ...
}
于 2013-06-10T20:54:18.163 回答
3

就是i < 5被忽略了。

完整的表达式是:

i < 5, i < c

这是由逗号运算符连接的两个单独的表达式。

逗号运算符通过计算第一个表达式 ( 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 */

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

于 2013-06-10T20:53:24.430 回答
3

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

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

i < 5, i < c

实际上相当于

i < c
于 2013-06-10T20:54:22.520 回答
2

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

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

  i < 5
  i < c
  i < 5 && i < c
于 2013-06-10T20:54:27.013 回答
1

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

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

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

于 2013-06-10T20:53:54.907 回答