我有一段代码:
#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");
}
}
我是一名新的编程学生,这是教授放在董事会上的一段代码,看看我们是否可以通过它。我理解这将如何编译,或者我认为。
显然代码的输出是无限循环,但形成了一个模式:
i j
0 3
0 2
0 1
Bang
0 1
Bang
Pop
1 3
1 2
1 1
Bang
1 1
Bang
Pop
让我感到困惑的部分是,do while循环声称只在while(j ==2)
进行循环,但j
的值在任何时候似乎都与输出无关。循环。我很困惑为什么j会从1开始,在爆炸之前,用j--;
输出Bang减去,然后再回到1.我也不明白为什么在某一点它只打印Bang,但是另一个点Bang和Pop,我理解它退出不同的循环范围,但我不明白它为什么这样做。
我将代码输入到visual studio 2013并获得了另一种输出:
i j
0 3
0 2
bang
0 1
bang pop
1 3
1 2
bang
1 1
这更有意义,因为打印Bang坚持while(j == 2)循环,但它仍然不知道为什么当j变为1时它会打印爆炸和弹出。
答案 0 :(得分:0)
我很困惑为什么j会从1开始,在爆炸之前,用j--减去;输出Bang,然后返回1.
当你说在爆炸之前j是1时你是对的,并且1允许它打印&#34; bang&#34;。但后来又回到了while循环,再次打印1(因为它仍然是1)下降到零(你不会看到因为它没有打印)然后打印&#34; bang& #34;再次。因为j是0(你从未见过),它会退出while循环并打印&#34; pop&#34;。模式重复,但现在我是1。
答案 1 :(得分:0)
首先,您需要了解while
和do-while
之间存在根本区别。
前者在进入循环体之前检查条件,这样循环体可以执行零次或多次。
后者在循环体之后检查,因此保证至少执行一次该体。因此代码片段:
int j = 99;
do {
puts ("Hello");
while (j == 42);
将输出Hello
,尽管事件j
42
附近
我发现对初学者非常有帮助的一件事是实际得到笔和纸并跟踪每一行代码,在脑中评估它,并保留当前变量值的记录:
i j Output
===== ===== ======
这将极大地帮助您学习。
此外,您可以(暂时)更改bang/pop
行以提供更多信息:
printf("Bang %d %d\n", i, j);
printf("Pop %d %d\n", i, j);
这也将使您更清楚地了解为什么一起看到它们。
考虑到上面的所有信息,您查看特定输出的原因是,每当您使用j == 0
退出内循环(刚刚被撞击)时,您也会退出中间循环,因为j
为零等同于j
为假。那也会让你流行。
只有当j
开始 1
处的内部循环时才会发生这种情况 - 正在do-while
,它至少会执行一次而j
将降至零。
在没有弹出的情况下爆炸的情况仅限于当j
零时退出内循环的情况。
j
是否以1
以外的任何其他值启动了内部循环,它会在1
退出,你会爆炸但不会弹出。