Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么以下代码段(一个使用“而另一个使用”for)有不同的行为?_C_Loops_For Loop_While Loop - Fatal编程技术网

C 为什么以下代码段(一个使用“而另一个使用”for)有不同的行为?

C 为什么以下代码段(一个使用“而另一个使用”for)有不同的行为?,c,loops,for-loop,while-loop,C,Loops,For Loop,While Loop,我一直在尝试一些涉及循环的基本练习 有人能告诉我为什么下面的代码片段有不同的输出吗 While循环 输出 For循环 输出 它们不是应该具有相同的输出吗?您从未在while循环中重新控制变量。尝试: while (i<3) { j = 0; while(j<3) { printf("(%d %d) ",i,j); j++; } i++; } 在您的代码中,发生的事情很简单-对于第一个循环,i=0,j=0,1,2

我一直在尝试一些涉及循环的基本练习

有人能告诉我为什么下面的代码片段有不同的输出吗

While循环 输出

For循环 输出


它们不是应该具有相同的输出吗?

您从未在while循环中重新控制变量。

尝试:

while (i<3)
{
    j = 0;
    while(j<3)
    {
        printf("(%d %d) ",i,j);
        j++;
    }
    i++;
}

在您的代码中,发生的事情很简单-对于第一个循环,i=0,j=0,1,2,3对于第二个循环,i=1,j=3…

内部while循环只执行一次,因为您的j变量等于3,并且永远不会重置。

在while循环开始之前,您不会像for循环那样重新初始化变量。试试这个:

i = 0;
while (i<3)
{
    j = 0;
    while(j<3)
    {
        printf("(%d %d) ",i,j);
        j++;
    }
    i++;
}

在while语句中,j的值保持为3,不再执行。它在for循环中重置

有人能告诉我为什么下面的代码片段有不同的输出吗

是的,它们并不等同。要使这两段代码等效,需要在while循环中初始化i=0,尤其是j=0,如下所示:

i = 0;
while (i < 3) { 
    j = 0;
    while(j < 3) { 
        printf("(%d %d)", i, j); 
        j++; 
    } 
    i++; 
} 
翻译成

init-statement
while(condition) {
    statement
    expression
}
j = 0;
while(j < 3) {
    printf("(%d %d)", i, j);
    j++;
}
特别是,

for(j = 0; j < 3; j++)   
    printf("(%d %d)", i, j);   
这是第一关

i = 0;
while(i < 3) {
    for(j = 0; j < 3; j++)
        printf("(%d %d)", i, j);
    i++;
} 
最后

i = 0;
while(i < 3) {
    j = 0;
    while(j < 3) {
        printf("(%d %d)", i, j);
        j++;
    }
    i++;
}

正如其他人所说,您还没有重置j变量。总的来说,我可以说

s1;
while(condition){
    s0;
    s2;
}
。。。不等于

for(s1;condition;s2){
    s0;
}
。。。因为如果s0包含continue,那么s2在第一种情况下不执行,而在第二种情况下执行


其次,s1中的变量声明将限于第二种情况下的循环。这曾经是人们想要的,但有时不是。在这种情况下,可以在循环之前进行声明。

这就是为什么要在变量应该存在的范围内声明变量。例如,这将返回与从For中获得的值相同的值

while (i<3)
{
    int j;
    while(j<3)
    {
        printf("(%d %d) ",i,j);
        j++;
    }
    i++;
}

为什么??因为j是为外部while的每个循环重新创建的。

又短又甜,当变量j在i的第一次迭代后达到3时,您没有重置它。
始终在使用while变量之前初始化它们。

在原样的代码中,第二个while不会再次激发,因为j==3。这是使for和while保持一致的正确方法。添加一行来显式初始化变量有助于使问题更清楚。如果您讨论的是Ninefingers的答案,变量j,那么它不会在其循环中重新初始化,因此它是正确的。@Erkan H-我不是在讨论Ninefingers的答案,我们几乎在几秒钟内就互相发布了帖子,我怎么可能一直在谈论他/她的答案呢?我误解了你的帖子,对不起。
for(i = 0; i < 3; i++) { 
    for(j = 0; j < 3 ; j++) 
        printf("(%d %d)", i, j); 
}
i = 0;
while(i < 3) {
    for(j = 0; j < 3; j++)
        printf("(%d %d)", i, j);
    i++;
} 
i = 0;
while(i < 3) {
    j = 0;
    while(j < 3) {
        printf("(%d %d)", i, j);
        j++;
    }
    i++;
}
s1;
while(condition){
    s0;
    s2;
}
for(s1;condition;s2){
    s0;
}
while (i<3)
{
    int j;
    while(j<3)
    {
        printf("(%d %d) ",i,j);
        j++;
    }
    i++;
}