C'for'循环中的多个条件

Pra*_*eek 28 c for-loop

我遇到了这段代码.我通常使用'&&'或'||' 在for循环中分隔多个条件,但此代码使用逗号来执行此操作.

令人惊讶的是,如果我改变条件的顺序,输出会有所不同.

#include<stdio.h>

int main() {
    int i, j=2;

    for(i=0; j>=0,i<=5; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出= 2 2 2 2 2 2

#include<stdio.h>

int main(){
    int i, j=2;

    for(i=0; i<=5,j>=0; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出= 2 2 2

有人能解释一下原因吗?它似乎只检查最后一个以逗号分隔的条件.

小智 56

逗号运算符计算其所有操作数并生成最后一个操作数的值.因此,基本上,无论您首先编写哪种情况,都会被忽视,而第二种情况只会是重要的.

for (i = 0; j >= 0, i <= 5; i++)
Run Code Online (Sandbox Code Playgroud)

因此等同于

for (i = 0; i <= 5; i++)
Run Code Online (Sandbox Code Playgroud)

这可能是也可能不是代码作者的意图,取决于他的意图 - 我希望这不是生产代码,因为如果程序员写了这个想表达条件之间的AND关系,那么这是不正确的,&&应该使用运算符.

  • 评估第一个条件`j> = 0`,但结果从未使用过.只要我不超过5,循环就会继续,即使j小于0.它*看起来像循环将停在j = -1,但它不会.很难称除了破碎以外的任何东西. (4认同)

Shi*_*zou 6

当然,这是正确的,你说什么开头,和C 逻辑运算符 &&||是什么您通常使用"连接"的条件(表达式,可以为真或假来评价); 逗号运算符不是逻辑运算符,并且在该示例中的使用没有意义,正如其他用户所解释的那样.您可以使用它来例如"连接"for the本身中的语句:您可以使用i初始化和更新j; 或以其他 方式使用逗号运算符

#include <stdio.h>

int main(void)  // as std wants
{
  int i, j;

  // init both i and j; condition, we suppose && is the "original"
  // intention; update i and j
  for(i=0, j=2; j>=0 && i<=5; i++, j--)
  {
       printf("%d ", i+j);
  }
  return 0;        
}
Run Code Online (Sandbox Code Playgroud)


abe*_*nky 5

逗号表达式采用最后一个(例如,最右侧)表达式的值.

所以在你的第一个循环中,唯一的控制表达是i<=5; 并被j>=0忽略.

在第二个循环中,j>=0控制循环,并被i<=5忽略.


至于一个原因 ......没有理由.这段代码是错的.除了混淆程序员之外,逗号表达式的第一部分什么都不做.如果一个认真的程序员写了这个,他们应该为自己感到羞耻,并取消键盘.