当前位置: 代码迷 >> java >> 为什么Java中的这段代码会陷入无限循环?
  详细解决方案

为什么Java中的这段代码会陷入无限循环?

热度:40   发布时间:2023-07-25 19:27:06.0

该代码是我的教职员工给出的用于打印图案的代码。 为什么此代码会陷入无限循环?

public static void main(String[] args)
{

    Scanner scan = new Scanner(System.in);
    System.out.print("Enter the number>");
    int num = scan.nextInt();

    for (int i = 0; i < num; i++) 
    {
       for (int j =0; j <=i; j ++)
       {
           num = num +1;
           System.out.print(num+" ");
       }
       System.out.println();
    }

}

仅当i> = num时,外循环才会结束。 每次它将i递增1,而在内循环内部,您还将变量num递增1。每次外循环运行,num都会被内循环多次递增。 因此,num将始终大于i,并且循环将永远运行。

循环是无限的,因为变量num在第二个变量内总是增加1(num = num +1),而在第一个变量中求值(i

对于任何大于0的整数输入,此函数都会进入一个无限循环。让我们逐步了解原因。

首先让我们假设输入为1。因此num =1。然后检查循环条件i <num(i初始化为0,num为1),条件为True,然后进入循环。

然后我们检查下一个循环条件j <= i(j初始化为0且i为0),该条件为true。

现在,我们终于可以解决num增加1的问题了。现在num = 2。

现在检查内部循环条件为假,因为j在循环结束时增加了。

现在检查外部循环条件是否仍然为num = 2和i = 1(请记住,i在循环结束时增加了)。 所以我<num是true,然后再次进入循环

现在应该清楚,外循环条件永远不会为假,循环将永远继续。

实际上,您的代码不会陷入无限循环。 其他答案已经告诉您,为什么您的代码没有在您期望的时间内结束(因为您在内部循环中增加了num ,从而使i < num没有预期的高),但是让我向您展示您的循环仍然可以完成。

我对您的代码做了一些更改:

int num = new Scanner(System.in).nextInt();
int i;
for (i = 0; i < num; i++) {
    for (int j =0; j <=i; j ++) {
        num = num +1;
    }
}
System.out.println("final i: " + i);
System.out.println("final num: " + num);

如您所见,我将i的声明从for块中移出,以便以后可以访问它,并且在循环内删除了System.out.println调用,因为它们很耗时(Java将访问同步到控制台资源)。 现在,该程序甚至不需要花很长时间即可完成,只需一两秒钟(取决于您的系统性能)。

输入“ 500”的结果如下所示:

决赛I:65536
最后号码:-2147450380

如您所见,程序已完成,并且i的值为65536(对于您为num的初始值输入的任何数字都具有该值),并且num为负数。 发生这种情况是因为int的值范围是-2,147,483,648到2,147,483,647,并且到最大值以上 (如果您将数字减少到最小值以下,则会“下溢”)。 代码在内部循环内递增num ,因此比在外部循环内递增i 这意味着num早于i达到整数的最大值,并且更早溢出。 在那一刻, i < num成为true ,外循环将退出。