为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_遁去的一_1 2022-07-06 15:57:10
我有代码:    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
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

此代码不是无限循环。


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

并终止。


查看完整回答
反对 回复 2022-07-06
?
哔哔one

TA贡献1854条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-07-06
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

好吧,不完全确定你的意思,但循环不是无穷无尽的。

由于整数溢出,i最终会变成的值,-1循环终止。

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


查看完整回答
反对 回复 2022-07-06
  • 3 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号