获得无限循环而不是预期的受控迭代

时间:2015-07-03 13:15:13

标签: c loops while-loop infinite-loop

当我运行以下代码时,它会进入无限循环。

我的预期输出是打印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;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

您的代码正在按预期执行。

通过说goto ll;,您基本上跳过 while (i < 2)支票。使用goto不会将程序控制转移到循环。它将控制权转移到该标签下的块的第一个语句。

相反,您可以尝试使用break;来获得预期的结果。 break;将突破内部 while循环,程序控件将到达外部while循环。

LIVE DEMO

另请注意,main()的推荐形式为int main(void)

[也许我偏向于移除goto,所以我没有注意到,还有另一种可能的解决方案,goto也是] < / SUP>

另一种方法是,您可以在内部j循环之外的label语句之后递增while。这样,在两个goto之后,j将变为3,因此,内部while将为假,然后,控件将到达另一个while在一次静默迭代之后,它也将变为false,因此程序将从外部while出来并最终终止。

LIVE DEMO 2

答案 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。这会使代码更难调试,并产生您可能不会立即注意到的问题,喜欢这个。