这个逗号在for循环的*test*部分中做了什么?

Mic*_*gan 5 c for-loop comma-operator

int c = someIntegerValue;

// Some code...

int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}
Run Code Online (Sandbox Code Playgroud)

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

tem*_*def 14

该声明

i < 5, i < c
Run Code Online (Sandbox Code Playgroud)

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

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

i < 5 && i < c
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助!

  • 我不会称之为"更好的方法".带有'&&`的版本在语义上与带逗号运算符的版本不同."&&"版本很可能是作者*的意思*,但不可能确定. (4认同)
  • `i <5 && i <c`和`i <5,i <c`不相同.正确的表达取决于原作者想要实现的逻辑. (2认同)

Kei*_*son 7

这是一个逗号运算符.它评估其左右操作数(始终按此顺序),并产生右操作数的结果.如果对左操作数的副作用进行评估,则使用它是有意义的; 由于i < 5没有副作用,您的编译器会向您发出警告.

i < 5不是i < c被忽略的.代码相当于:

for ( i = 0; i < c; i++ ) {
     ...
}
Run Code Online (Sandbox Code Playgroud)

很难猜出它的目的是什么.也许作者实际意味着:

for ( i = 0; i < 5 && i < c; i++ ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)