我遇到了这段代码.我通常使用'&&'或'||' 在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关系,那么这是不正确的,&&
应该使用运算符.
当然,这是正确的,你说什么开头,和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)
逗号表达式采用最后一个(例如,最右侧)表达式的值.
所以在你的第一个循环中,唯一的控制表达是i<=5
; 并被j>=0
忽略.
在第二个循环中,j>=0
控制循环,并被i<=5
忽略.
至于一个原因 ......没有理由.这段代码是错的.除了混淆程序员之外,逗号表达式的第一部分什么都不做.如果一个认真的程序员写了这个,他们应该为自己感到羞耻,并取消键盘.