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

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

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

 #include 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 int main(){ int i, j=2; for(i=0; i=0; i++) { printf("%d ", i+j); j--; } return 0; } 

输出= 2 2 2

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

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

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

因此等同于

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

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

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

 #include  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; } 

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

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

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


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

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

 j >= 0, i <= 5 

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

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

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

维基百科告诉逗号运算符做什么:

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

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

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

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

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

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