有趣的问题实际上,在两种情况下循环都是无止境的
但是它们之间的主要区别在于何时终止以及x
超过最大值需要多少时间int
,2,147,483,647
之后最大值将达到溢出状态并终止循环。
理解此问题的最佳方法是测试一个简单的示例并保留其结果。
范例:
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
输出:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
测试此无限循环后,将花费不到1秒的时间终止。
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
输出:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
在这个测试用例中,您会注意到终止和完成运行程序所花费的时间差异很大。
如果您没有耐心,您会认为此循环是无尽的,不会终止,但实际上要花费几个小时才能终止并达到i
值的溢出状态。
最后,在将print语句放入for循环后,我们得出的结论是,比起没有print语句的第一种情况,循环所花的时间要多得多。
运行程序所花费的时间取决于您的计算机规格,特别是处理能力(处理器容量),操作系统和正在编译程序的IDE。
我在以下情况下测试这种情况:
联想2.7 GHz Intel Core i5
操作系统:Windows 8.1 64x
IDE:NetBeans 8.2
完成该程序大约需要8个小时(486分钟)。
您还可以注意到for循环中的步长增量 i = i + 1
是达到最大int值的非常慢的因数。
我们可以更改此因子,使步长增加更快,以便在更短的时间内测试循环。
如果我们进行i = i * 10
测试:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
输出:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
如您所见,与之前的循环相比,它非常快
终止并完成运行该程序不到1秒。
在这个测试示例之后,我认为它应该澄清问题并证明Zbynek Vyskovsky-kvr000答案的正确性,也将是对该问题的答案。
x
增长得快j
。换句话说,j
它将永远不会达到上限,因此循环将“永远”运行。好吧,不是永远,您很可能在某个时候出现溢出。