int c = someIntegerValue;
// Some code...
int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}
我的编译器说error: expression has no effect
,这听起来很对。那么,这里将使用这两个比较中的哪一个?我的猜测是i < c
被忽略了,但我想得到其他人的确认,因为我还不能运行这段代码......
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
它实际上考虑了这两个表达式。
也就是说,我不确定为什么这是编译器错误而不是编译器警告。这是合法代码,尽管几乎可以肯定它是一个错误。也许您已将编译器设置为在警告时报告错误?
希望这可以帮助!
那是一个逗号运算符。它计算它的左操作数和右操作数(总是按那个顺序),并产生右操作数的结果。如果评估左操作数的副作用,则使用它是有意义的;因为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
) 来工作,完整的表达式采用第二部分的值。
表达式的第一部分只有在它有副作用时才重要。
它是常用的,并且以这种方式正确使用:
示例
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
) 是空操作,因此您会收到所看到的警告。现在的问题是“作者的意图是什么?” 没有更多的上下文,我们真的不能说,但它很可能是其中之一:
i < 5
i < c
i < 5 && i < c
在这里,
,逗号运算符起作用。意思是,它从左到右计算并返回最后一个表达式。所以i<5
被评估,i<c
被评估但返回i<c
结果作为它的最后一个表达式。
i < 5, i < c
完全没有意义。与 没有区别i < c
。
根据作者的逻辑,这是一个错误。