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

时间:2019-03-03 00:35:23

标签: java

此代码是我的老师为打印图案提供的。 为什么此代码会陷入无限循环?

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();
    }

}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

此函数将为任何大于0的整数输入进入无限循环。 让我们浏览一下为什么。

首先让我们假设输入为1。 所以num = 1。 然后我们检查循环条件i

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

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

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

现在检查外部循环条件仍然正确,因为num = 2和i = 1(请记住,i在循环结束时增加了)。所以我

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

答案 3 :(得分:0)

实际上,您的代码不会进入无限循环。其他答案已经告诉您,为什么您的代码没有在您期望的时间内结束(因为您在内部循环中增加了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和when you increment a number over the maximum, it "overflows"(如果将数字减少到最小值以下,则会“下溢”)。代码在内部循环内递增num,因此比在外部循环内递增i更频繁。这意味着num早于i达到整数最大值,并且更早溢出。在那一刻,i < num变成true,外部循环将退出。