2013-04-03 24 views
4

我試圖找出爲什麼這個循環終止...當RHS == Integer.MAX_VALUE時,int的布爾比較,爲什麼這個循環終止?

@Test 
public void test() { 

    int counter=0; 
    int from = 0; 
    int until = Integer.MAX_VALUE; 

    while(counter <= until) { 
     counter++; 
     if(counter < from) { 
      System.out.println("continuing " + counter + " <= " + from); 
      continue; 
     } 
    } 
    System.out.println("finished " + counter); 
} 

while(counter <= until)應該始終解析爲true因爲計數器不能超過Integer.MAX_VALUE的增加。因此,循環不應該終止。

然而,在Eclipse中,如果我用JUnit運行運行我得到:

finished 108772 

如果我在調試器中運行,我得到:

finished 125156 

if(counter < from)的輸出是從來沒有輸出。如果我刪除該塊,代碼仍然終止,這次是Integer.MAX_VALUE。

finished 2147483647 
+7

我不希望這會終止。一個'int'總是'<= Integer.MAX_VALUE'。 –

+0

它終止於'int until = Integer.MAX_VALUE-1;' –

+0

這很奇怪。對我而言,大多數時候它會給出大約30萬的不一致的值。我認爲它必須是某種編譯器優化,因爲它肯定不應該終止。現在看看它... – gandaliter

回答

0

真的不知道你正在嘗試在這裏做你的while循環將如預期,但距離不會改變,因此「反不到」永遠不會被執行?

,直到(最大INT)將於= 2147483647

如果你改變了while循環(計數器<到)你得到的 「成品2147483647」

,幫助輸出文本?

+0

是的,該塊永遠不會執行,但奇怪的是它會改變行爲(參見上面更新的問題)。該塊*確實*終止。 –

0

我無法重現您的輸出,所以這不是一個答案,只是一個觀察。考慮這些線。

int counter=0; 
int until = Integer.MAX_VALUE; 
while(counter <= until) { 
    counter++; 

while條件是'小於或等於'。所以當計數器等於Integer.MAX_VALUE時,就會添加一個。這會產生最大可能的Java負數。繼續向此值添加一個,它最終會變爲零,然後再次向上計數,直到達到Integer.MAX_VALUE。然後整個序列重新開始。它對我來說看起來像一個無限循環。

也將執行「繼續」線在每次迭代而從最大負數計數。

+0

同意 - 你可能在我編輯問題之前/之後發佈,具體詢問「爲什麼這會終止?」。 –