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

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循环

LIVE DEMO

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


[可能我偏向于去掉goto,所以没注意到,还有另一种可能的解决方案,也有goto ]

另一种方法,您可以在内部 while 循环之外的标签语句之后递增 j。这样,经过两个goto后,j就会变成3,所以,里面的while就是false,然后,控件就会到达另一个[=15] =] 并在一次静默迭代后,它也将变为 false,因此程序将从外部 while 出来并最终终止。

LIVE DEMO 2

您忘记添加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。它会使代码更难调试,并产生您可能没有注意到的问题离开,就像这个。