Java 为什么在无止境循环代码中有不同的结果

Java 为什么在无止境循环代码中有不同的结果,java,Java,我有密码: public static void main(String[] args) { int i=0; while(true){ i++; System.out.println(i); //(1) if(i==-1){ break; } } } 如果有代码(1),它将以无限循环运行, 但是如果没有代码(1),代码就不能在endlessLoop中运行,并且没有错误,

我有密码:

    public static void main(String[] args) {
    int i=0;
    while(true){
        i++;
        System.out.println(i);  //(1)
        if(i==-1){
            break;
        }
    }
 }
如果有代码(1),它将以无限循环运行, 但是如果没有代码(1),代码就不能在endlessLoop中运行,并且没有错误,就像没有循环一样,但是如果我在调试模型中运行,它可以在无尽的循环中运行

那么为什么会有这样的结果呢


我的IDE是idea,java1.8

这段代码不是一个无止境的循环

由于整数溢出,
i
最终将变为负值。它将溢出到
整数.MIN_值
,最终将达到-1

但是,当您包含该print语句时,需要很长时间才能完成(它必须打印超过40亿个
i
)的值,因此它似乎是无止境的

删除print语句后,速度会快得多

也就是说,如果编译器决定循环不执行任何操作,那么它甚至可能决定优化整个循环,这将把运行时间减少到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

当我达到最大值(
Integer.max_value
)时,循环将结束,因为在溢出时,我最终将达到-1,循环将终止。

嗯,不完全确定您的意思,但循环不是无止境的

由于整数溢出,
i
的值最终将变为
-1
,循环将终止


打印
i
与否无关。只是将所有内容写入控制台需要更长的时间。

如果
i
从0开始,并在循环中每次增加,它怎么可能是0?我并不是真的理解这个问题,“代码(1)”是什么意思?代码1是什么?是的。谢谢你,用中文我会说你是这样的。”牛逼”,