繁体   English   中英

java中for循环的特殊行为

[英]Peculiar behaviour of for loop in java

今天在阅读拳击和自动拳击时,我想出了一个场景,并发现我被困在无限循环中的奇特行为。

我检查了我的代码两次,但我没有发现任何错误。 如果有人可以看,并建议我在哪里做错了,这样我就会出现这个无限循环

请找到下面的代码。

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

请注意,您的END等于Integer可以容纳的最大可能值(值为2147483647 )。 这意味着对于i可能持有的任何值, i <= END始终为真。 i实际达到2147483647 ,它仍然<= END 在下一次迭代中,您尝试将其递增1,这会导致溢出,并且i变为-2147483648 ,仍然<= END ,并且循环将永远继续。

这是因为你设置了i <= 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++) {

会解决的。

for (int i = START; i <= END; i++) { ==>这里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++) {

START值为2147483547您已将其迭代为END2147483647

START达到2147483647它以-2147483648开头

这是程序中的整数溢出。 由于int数据类型在Java中是32位,因此任何超过32位的值都会被翻转。 在数值方面,它表示在Integer.MAX_VALUE(2147483647)上递增1后,返回的值将为-2147483648。 发生此类情况时,JVM不会发出警告或异常。

这已经在Java 8中处理了一个溢出时抛出ArithmeticException检查这个这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM