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

时间:2010-02-05 19:18:42

标签: c loops for-loop while-loop

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

有人可以告诉我为什么以下代码段有不同的输出?


While Loop

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

输出

(0 0) (0 1) (0 2)

For Loop

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

输出

(0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2) 

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

9 个答案:

答案 0 :(得分:15)

尝试:

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 ...

答案 1 :(得分:9)

在while循环开始之前,您没有重新初始化变量,就像在for循环中一样。试试这个:

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

答案 2 :(得分:5)

你永远不会在while循环中重新启动变量。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

  

有人可以告诉我为什么以下代码段有不同的输出?

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

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

请记住

for(init-statement condition; expression) {
    statement
}

被翻译为

init-statement
while(condition) {
    statement
    expression
}

特别是

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

被翻译为

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

因此,在进入内部j = 0循环之前,您缺少非常关键的while初始化,以及在进入外部i = 0循环之前while初始化。< / p>

所以要把它全部包起来,

的翻译
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++;
}

答案 5 :(得分:1)

简短而甜蜜,一旦在“i”的第一次迭代后命中3,你就没有重置变量“j”。 在使用之前始终初始化while变量。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

正如其他人所说,您尚未重置j变量。一般来说,我可以说

s1;
while(condition){
    s0;
    s2;
}

......不等于......

for(s1;condition;s2){
    s0;
}

...因为如果s0包含continue,则s2在第一种情况下不执行,在第二种情况下执行。

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

答案 8 :(得分:0)

这就是为什么你在它们应该存在的范围内声明变量的原因。例如,这应该返回与你从for获得的相同的值。

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

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