C 关于for循环内部do-while循环的演练

C 关于for循环内部do-while循环的演练,c,do-while,C,Do While,我有一段代码: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { for (int i = 0; i < 3; i++) { int j = 3; while (j) { do { printf("%d %d\n", i, j);

我有一段代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main()
{
    for (int i = 0; i < 3; i++)
    {
        int j = 3;
        while (j)
        {
            do
            {
                printf("%d %d\n", i, j);
                j--;
            } while (j == 2);
            printf("Bang\n");
        }
        printf("Pop\n");
    }
}
让我感到困惑的是,do while循环声称只有当whilej==2时才执行循环,但在任何情况下,j的值似乎都与循环的输出无关。我不明白为什么在爆炸之前,j会从1变为,用j-减去;输出砰的一声,然后返回到1。我也不明白为什么在一个点上它只打印砰的一声,但在另一个点上砰的一声,我知道它存在不同范围的循环,但我不明白它为什么会这样

我将代码输入到visual studio 2013中,得到了一个可选输出:

i    j
0    3
0    2
bang
0    1
bang pop
1    3
1    2
bang
1    1
这更有意义,因为打印Bang遵循whilej==2循环,但它仍然不知道为什么在j达到1时打印Bang和pop

我不明白为什么在爆炸之前,j会从1变为,用j-减去;输出砰的一声,然后返回到1


你说j在爆炸前是1是对的,1允许它打印爆炸。但是它回到while循环,再次打印1,因为它仍然是1,下降到零,你看不到,因为它不打印,然后再次打印bang。因为j是0,你从来没有见过它退出while循环并打印pop。模式重复,但现在我是1。

您首先需要了解while和do-while之间有一个基本的区别

前者在进入循环体之前检查条件,以便循环体可以执行零次或多次

后者在循环体之后进行检查,因此保证至少执行该体一次。因此,代码片段:

int j = 99;
do {
    puts ("Hello");
while (j == 42);
将输出Hello,尽管事实上j远未接近42

我发现对初学者非常有用的一件事是,实际获得一支笔和一张纸,跟踪每一行代码,在头脑中对其进行评估,并记录当前变量值:

  i      j    Output
=====  =====  ======
这将大大有助于你的学习过程

此外,您可以临时更改“爆炸/弹出”行以提供更多信息:

printf("Bang %d %d\n", i, j);
printf("Pop %d %d\n", i, j);
这也会让你明白为什么你会看到他们在一起

考虑到上面的所有信息,您看到特定输出的原因是,每当您在j==0刚发出砰砰声的情况下退出内部循环时,您也会退出中间循环,因为j为0相当于j为false。那也会让你崩溃

只有当j在1开始内部循环时才会发生这种情况,同时,它将至少执行一次,并且j将下降到零

当j不为零时,砰砰而不弹出的情况仅限于退出内循环的情况


如果j以1以外的任何值启动内部循环,它将以1退出,您将发出砰砰声,但不会弹出。

我仍然不明白为什么假设j为1时,它会打印砰砰声,而所有循环都没有显示。另外,它是如何打印j为1的,但是,正如你所说,打印bang,因为j为1,bang的打印语句不仅在,但是超出了i和j print语句的局部范围。我不明白为什么j为1会提示程序完全离开两个循环,而这两个循环都没有指示1作为循环的参数。因为1!=2,j等于1是离开最深循环和打印砰的一个条件。是的,这两个都是打字错误,对不起,我正忙着找出这个问题的根源,忽略了这些错误。我知道,尽管有条件,do while仍会打印一次输出,但它并不能真正帮助我解释问题。@Impugnor,那么我建议您按照答案第二部分中的建议进行操作。坐下来,拿着纸和笔,在您的wetware中运行代码。@inpugnor,请参阅更新。老实说,如果你想理解它,你只需要继续努力,尽管我希望更新可能会有所帮助。实际上我想我已经弄明白了,第一次循环j是3,并且自动按照do while逻辑打印,然后j-开始使它变为2,2与whilej==2语句一致,因此,打印j再次为2。然后,j-将j减少到1,它离开循环一次,但由于j仍然是真值,它与上面的whilej范围一致,whilej,它离开打印bang,然后返回循环。它再次打印j为1,然后j-使j为0,完全因为它是一个假值而离开循环。@Impugnor,现在您得到了它。看看这台机器。是机器。毫无疑问,一旦你意识到人是糊状的、不符合逻辑的,计算机变得更有意义,让你像我一样在社交上有些无能,但我认为好处大于坏处:-只是开玩笑-你可以像机器一样思考,也可以保持人与人之间的联系。
printf("Bang %d %d\n", i, j);
printf("Pop %d %d\n", i, j);