我有代码:
public static void main(String[] args) {
int i=0;
while(true){
i++;
System.out.println(i); //(1)
if(i==-1){
break;
}
}
}
如果有代码(1),它将无限循环运行, 但是,如果没有代码(1),则该代码无法在endlessLoop中运行,并且就像没有循环一样没有错误,但是如果我在debug模型中运行,则它可以在endless Loop中运行。
那么为什么会有这个结果。
我的IDE是个主意,而java1.8
答案 0 :(得分:5)
此代码不是无限循环。
i
最终将由于整数溢出而变为负数。它将溢出到Integer.MIN_VALUE
,最终将达到-1。
但是,当您包含该打印语句时,它需要很长时间才能完成(它必须打印超过40亿个i
值),因此它看起来是无止境的。
删除打印语句后,它变得更快。
也就是说,如果编译器确定循环不执行任何操作,甚至可能决定优化整个循环,这会将运行时间减少到0。
如果添加仅打印少量值的条件,则即使使用println
语句,循环也会终止,这将使执行速度更快。
例如,每1亿个值打印一次:
public static void main(String[] args) {
int i=0;
while(true) {
i++;
if (i%100000000 == 0) System.out.println(i);
if(i==-1){
break;
}
}
}
将输出:
100000000
200000000
300000000
400000000
500000000
600000000
700000000
800000000
900000000
1000000000
1100000000
1200000000
1300000000
1400000000
1500000000
1600000000
1700000000
1800000000
1900000000
2000000000
2100000000
-2100000000
-2000000000
-1900000000
-1800000000
-1700000000
-1600000000
-1500000000
-1400000000
-1300000000
-1200000000
-1100000000
-1000000000
-900000000
-800000000
-700000000
-600000000
-500000000
-400000000
-300000000
-200000000
-100000000
然后终止。
答案 1 :(得分:1)
当我达到最大值(Integer.MAX_VALUE
)时循环将结束,因为溢出时我最终将达到-1并终止循环。
答案 2 :(得分:1)
嗯,不是很清楚你的意思,但是循环不是无止境的。
由于整数溢出,i
的值最终将变为-1
,循环将终止。
是否打印i
都不重要。只是将通知写到控制台需要更长的时间。