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

时间:2013-05-31 13:56:53

标签: 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;
}

输出= 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;
}

输出= 2 2 2

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

7 个答案:

答案 0 :(得分:51)

逗号运算符计算其所有操作数并生成最后一个操作数的值。因此,基本上,无论你写的是哪个条件,它都会被忽略,而第二个只会是重要的。

for (i = 0; j >= 0, i <= 5; i++)
因此

等同于

for (i = 0; i <= 5; i++)

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

答案 1 :(得分:6)

当然,你在开头说的是正确的,C logical operator &&||是你通常用来“连接”条件的表达式(可以评估为对或错);逗号运算符不是逻辑运算符,并且在该示例中的使用没有意义,正如其他用户所解释的那样。你可以使用它,例如为了自己的“连接”语句:你可以用i初始化和更新j;或使用other ways

中的逗号运算符
#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;        
}

答案 2 :(得分:5)

逗号表达式采用最后(例如最右侧)表达式的值。

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

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


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

答案 3 :(得分:3)

Wikipedia告诉逗号运算符:

“在C和C ++编程语言中,逗号运算符(由标记,表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(并输入)。“

答案 4 :(得分:3)

不要使用此代码;无论谁写清楚,都会对语言产生根本性的误解,并且不值得信赖。表达式:

j >= 0, i <= 5

评估“j&gt; = 0”,然后扔掉它并对它做任何事情。然后它评估“i&lt; = 5”并且仅使用它作为结束循环的条件。当左操作数有副作用时,逗号运算符可以在循环条件中有意义地使用;你会经常看到这样的事情:

for (i = 0, j = 0; i < 10; ++i, ++j) . . .

其中逗号用于潜入额外的初始化和增量语句。但是显示的代码并没有这样做,或者其他任何有意义的代码。

答案 5 :(得分:2)

C中有一个名为逗号运算符的运算符。它按顺序执行每个表达式并返回最后一个语句的值。它也是sequence point,意味着每个表达式都保证在序列中的下一个表达式执行之前完全按顺序执行,类似于&&||

答案 6 :(得分:0)

完成Crocker先生的回答,小心++或 - 运营商,或者我不知道其他运营商。 它们会影响循环。例如,我在课程中看到了与此类似的代码:

for(int i=0; i++*i<-1, i<3; printf(" %d", i));

结果将是$ 1 2 $。所以第一个语句影响了循环,而下面的结果是很多零。

for(int i=0; i<3; printf(" %d", i));