今天在阅读拳击和自动拳击时,我想出了一个场景,并发现了我被困在无限循环中的特殊行为。
我检查了两次代码,但没有发现任何错误。 如果有人可以看,并建议我在哪里做错了,这样我就会出现这个无限循环
请找到以下代码。
public class InTheLoop {
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 100;
public static void main(String[] args) {
int count = 0;
//Infinite loop starts.
for (int i = START; i <= END; i++) {
count++;
System.out.println(count);
}
// This never got printed.
System.out.println("hi I am out of for loop" +count);
}
}
答案 0 :(得分:4)
请注意,您的END
等于Integer
可以容纳的最大可能值(值为2147483647
)。这意味着对于i
可能持有的任何值,i <= END
始终为真。当i
实际到达2147483647
时,它仍为<= END
。在下一次迭代中,您尝试将其递增1,这会导致溢出,i
变为-2147483648
,仍然是<= END
,并且循环将永远继续。
答案 1 :(得分:2)
因为你设置了 i&lt; = END , 一旦达到Integer.MAX_VALUE,就会执行increment(i ++),这使得它为-2147483648(Integer.MAX_VALUE + 1)。
这就是为什么它没有破坏并继续运行。
改变,
for (int i = START; i <= END; i++) {
到
for (int i = START; i < END; i++) {
将解决。
答案 2 :(得分:1)
for (int i = START; i <= END; i++) {
==&gt;这里i <= END;
是罪魁祸首。
当循环运行时,i
在每次迭代时递增1,然后将其与end进行比较。所以,
最初 - i = 2147483547
一旦i
到达2147483647
(Integer.Max_VALUE),它再次递增1,所以,你得到溢出和循环
这样的事情发生了:
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646.
将您的代码更改为:for (int i = START; i < END; i++) {
答案 3 :(得分:0)