int c = someIntegerValue;
// Some code...
int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}
我的编译器说error: expression has no effect
,这听起来是正确的。那么,这两个比较中的哪一个将在这里使用?我的猜测是i < c
被忽略了,但我想得到其他人的一些确认,因为我还无法运行这段代码......
答案 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
没有区别。
根据作者的逻辑,它是一个错误。