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
没有区别。
根据作者的逻辑,这是一个错误。