问题描述
该代码是我的教职员工给出的用于打印图案的代码。 为什么此代码会陷入无限循环?
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();
}
}
1楼
仅当i> = num时,外循环才会结束。 每次它将i递增1,而在内循环内部,您还将变量num递增1。每次外循环运行,num都会被内循环多次递增。 因此,num将始终大于i,并且循环将永远运行。
2楼
循环是无限的,因为变量num在第二个变量内总是增加1(num = num +1),而在第一个变量中求值(i
3楼
对于任何大于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,然后再次进入循环
现在应该清楚,外循环条件永远不会为假,循环将永远继续。
4楼
实际上,您的代码不会陷入无限循环。
其他答案已经告诉您,为什么您的代码没有在您期望的时间内结束(因为您在内部循环中增加了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
,外循环将退出。