猿问

为什么我在无限循环代码中有不同的结果

我有代码:


    public static void main(String[] args) {

    int i=0;

    while(true){

        i++;

        System.out.println(i);  //(1)

        if(i==-1){

            break;

        }

    }

 }

如果有代码(1),它将在无限循环中运行,但如果没有代码(1),则代码不能在无限循环中运行,并且就像没有循环一样没有错误,但是如果我在调试模型中运行,它可以无限循环运行。


那么为什么会有这个结果。


我的IDE是idea,java1.8


qq_遁去的一_1
浏览 132回答 3
3回答

杨__羊羊

此代码不是无限循环。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;        }    }}将输出:100000000200000000300000000400000000500000000600000000700000000800000000900000000100000000011000000001200000000130000000014000000001500000000160000000017000000001800000000190000000020000000002100000000-2100000000-2000000000-1900000000-1800000000-1700000000-1600000000-1500000000-1400000000-1300000000-1200000000-1100000000-1000000000-900000000-800000000-700000000-600000000-500000000-400000000-300000000-200000000-100000000并终止。

哔哔one

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

料青山看我应如是

好吧,不完全确定你的意思,但循环不是无穷无尽的。由于整数溢出,i最终会变成的值,-1循环终止。打印i与否都没有关系。只是将所有内容写入控制台需要更长的时间。
随时随地看视频慕课网APP

相关分类

Java
我要回答