亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我在無限循環代碼中有不同的結果

為什么我在無限循環代碼中有不同的結果

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 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號