当我运行以下代码时,它会进入无限循环。
我的预期输出是打印Hello
2次并退出。这是什么问题?
#include <stdio.h>
#include <conio.h>
int main()
{
int i = 0, j = 0;
while (i < 2)
{
l1 : i++;
while (j < 3)
{
printf("Hello\n");
goto l1;
}
}
}
答案 0 :(得分:3)
您的代码正在按预期执行。
通过说goto ll;
,您基本上跳过 while (i < 2)
支票。使用goto
不会将程序控制转移到循环。它将控制权转移到该标签下的块的第一个语句。
相反,您可以尝试使用break;
来获得预期的结果。 break;
将突破内部 while
循环,程序控件将到达外部while
循环。
另请注意,main()
的推荐形式为int main(void)
[也许我偏向于移除goto
,所以我没有注意到,还有另一种可能的解决方案,goto
也是] < / SUP>
另一种方法是,您可以在内部j
循环之外的label语句之后递增while
。这样,在两个goto
之后,j
将变为3
,因此,内部while
将为假,然后,控件将到达另一个while
在一次静默迭代之后,它也将变为false,因此程序将从外部while
出来并最终终止。
答案 1 :(得分:1)
您忘了添加j++
l1: i++;
j++; // add this to terminate it after 2 iterations
while (j < 3)
{
...
请参阅http://ideone.com/ZbVo8y演示。
答案 2 :(得分:1)
如果你想输出两次&#34;你好&#34;只需对程序进行最小的更改就足以在代码中添加两个加号(一个运算符)。:)
#include <stdio.h>
#include <conio.h>
int main()
{
int i = 0, j = 0;
while (i < 2)
{
l1 : i++;
while (++j < 3)
{
printf("Hello\n");
goto l1;
}
}
}
您甚至可以使您的程序更复杂,再添加一个goto
语句。:)例如
#include <stdio.h>
#include <conio.h>
int main()
{
int i = 0, j = 0;
goto l2;
while (i < 2)
{
l1 : i++;
while (++j < 3)
{
printf("Hello\n");
l2:goto l1;
}
}
}
然而,该计划将输出&#34;你好&#34;以前两次。:)
顺便说一下,这是在IBM编写程序的方式。:)在IBM,有很多关于使用goto语句的专家。:)
答案 3 :(得分:0)
首先,j
永远不会更改代码中的值。这是有问题的,因为每次循环运行并跳转到L1
时,它都会重新进入循环。永远不会检查(i < 2)
,因为它发生在标签L1
之前。
除非您将此作为练习来学习汇编式编程,否则我建议避免在C中使用goto
。这会使代码更难调试,并产生您可能不会立即注意到的问题,喜欢这个。