获得无限循环而不是预期的受控迭代
Getting infinite loop instead of expected controlled iteration
当我运行下面的代码时,它进入了无限循环。
我的预期输出是打印 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;
}
}
}
您的代码正在执行它应该执行的操作。
通过说 goto ll;
,您实际上是在 跳过 while (i < 2)
检查。使用 goto
不会将程序控制转移到循环。它控制该标签下块的第一条语句。
相反,您可以尝试使用 break;
来获得预期的结果。 break;
会跳出内while
循环,程序控制会到达外while
循环
另请注意,main()
的推荐形式是int main(void)
[可能我偏向于去掉goto
,所以没注意到,还有另一种可能的解决方案,也有goto
]
另一种方法,您可以在内部 while
循环之外的标签语句之后递增 j
。这样,经过两个goto
后,j
就会变成3
,所以,里面的while
就是false,然后,控件就会到达另一个[=15] =] 并在一次静默迭代后,它也将变为 false,因此程序将从外部 while
出来并最终终止。
您忘记添加j++
l1: i++;
j++; // add this to terminate it after 2 iterations
while (j < 3)
{
...
请参阅 http://ideone.com/ZbVo8y 演示。
如果你想输出恰好两次 "Hello" 而对程序的改动最少,那么只需在代码中添加两个加号(一个运算符)就足够了。:)
#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;
}
}
}
尽管如此,程序仍会像以前一样输出 "Hello" 两次。:)
顺便说一句,IBM 就是这样编写程序的。:) 在 IBM 中,有很多使用 goto 语句的优秀专家。:)
首先,j
永远不会更改代码中的值。这是有问题的,因为每次循环运行并跳转到 L1
时,它都会立即返回循环。 (i < 2)
永远不会被检查,因为它发生在标签 L1
.
之前
除非您将其用作学习汇编风格编程的练习,否则我建议避免在 C 中使用 goto
。它会使代码更难调试,并产生您可能没有注意到的问题离开,就像这个。
当我运行下面的代码时,它进入了无限循环。
我的预期输出是打印 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;
}
}
}
您的代码正在执行它应该执行的操作。
通过说 goto ll;
,您实际上是在 跳过 while (i < 2)
检查。使用 goto
不会将程序控制转移到循环。它控制该标签下块的第一条语句。
相反,您可以尝试使用 break;
来获得预期的结果。 break;
会跳出内while
循环,程序控制会到达外while
循环
另请注意,main()
的推荐形式是int main(void)
[可能我偏向于去掉goto
,所以没注意到,还有另一种可能的解决方案,也有goto
]
另一种方法,您可以在内部 while
循环之外的标签语句之后递增 j
。这样,经过两个goto
后,j
就会变成3
,所以,里面的while
就是false,然后,控件就会到达另一个[=15] =] 并在一次静默迭代后,它也将变为 false,因此程序将从外部 while
出来并最终终止。
您忘记添加j++
l1: i++;
j++; // add this to terminate it after 2 iterations
while (j < 3)
{
...
请参阅 http://ideone.com/ZbVo8y 演示。
如果你想输出恰好两次 "Hello" 而对程序的改动最少,那么只需在代码中添加两个加号(一个运算符)就足够了。:)
#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;
}
}
}
尽管如此,程序仍会像以前一样输出 "Hello" 两次。:)
顺便说一句,IBM 就是这样编写程序的。:) 在 IBM 中,有很多使用 goto 语句的优秀专家。:)
首先,j
永远不会更改代码中的值。这是有问题的,因为每次循环运行并跳转到 L1
时,它都会立即返回循环。 (i < 2)
永远不会被检查,因为它发生在标签 L1
.
除非您将其用作学习汇编风格编程的练习,否则我建议避免在 C 中使用 goto
。它会使代码更难调试,并产生您可能没有注意到的问题离开,就像这个。