2012-11-09 105 views
3

我寫了下面的代碼,當我有打印語句並且沒有它時,它會以不同的方式回答。Java溢出問題

class test 
{ 
    public static void main(String args[]) 
    { 
     int i = Integer.MAX_VALUE; 
     int j = Integer.MAX_VALUE-100; 
     int count = 0; 
     for(; j<=i; j++){ 
     count++; 
     //System.out.println(j); // If we remove comment, answer is different 
     } 
    System.out.println(count + ", " + j + ", " + (j<=i));   
    } 
} 

沒有打印語句回答是:

101, -2147483648, true 

和閱讀的說法是:

15588, -2147468161, true 

在這兩種情況下,最終狀態應該返回false,但它返回true 。有人可以解釋這一點。

+1

如果你改正了你的代碼,所以'j <= i'代替'j

+1

我認爲這是一個重複http://stackoverflow.com/questions/12793248/for-loop-terminating-early-when-comparing-to-integer-max-value-and-using-system – auselen

+0

@auselen不確定如果它是重複的,因爲有些人似乎看到openJDK 7的問題,而另一個問題是在JDK 6上的...... – assylias

回答

6

j <= Integer.MAX_VALUE根據定義總是如此。在這兩種情況下,你的循環都不會結束。

如果將其更改爲j < i,則循環將終止,並且無論打印語句如何,都將返回相同的答案。

EDIT

當測試使用Netbeans/Oracle的JDK 7u9的代碼,如所預期的循環永遠不會結束。但是有些報道稱他們看到的問題與問題中所描述的行爲相同。 @auselen指向this similar post這是指一個錯誤。

+1

是的,需要使用<<來終止循環。在這種情況下,無論打印語句如何,我都可以得到相同的答案。 –

+3

@DuncanJones是的,在這種情況下,輸出「100,2147483647,true」,帶或不帶打印語句。 – assylias

+1

這並不回答爲什麼'println()'語句改變輸出。對我來說,'println()'會導致程序無限循環,但如果沒有它,它會正常工作。 – Keppil

3

這是正常的最終條件是true因爲最終迭代之後,j會從Integer.MAX_VALUEInteger.MIN_VALUE,因此變得比i小。

但是,我不知道爲什麼把一個打印語句會影響變量的值......據我所知,它不應該有任何副作用。

+1

但爲什麼循環退出? j必須大於MAX_VALUE才能使循環條件成爲假,並且終止循環,這應該是不可能的 – Bohemian

0

該循環結束時j<=i,因此在最後,(j <= i)爲真。如果你希望它是假的,你將不得不在for循環中設置j <= i + 1

+0

對不起。但是你的陳述是錯誤的。當j <= i爲假時,循環應該結束。 – damned

0

我不完全得到和你一樣的結果。

沒有打印聲明,我得到Integer.MAX_VALUE - 1true

環路實際執行4294967395倍(變countlong看到這一點):

long count = 0; // make this change 

輸出則是:

4294967395, 2147483646, true 

4294967395正是Integer.MAX_VALUE - Integer.MIN_VALUE + 100,這意味着它遍歷所有的方式通過每個int值然後備份到Integer.MAX_VALUE時間。

從理論上講,環不應該終止,因爲這是不可能的一個int超過Integer.MAX_VALUE,但它確實終止

在這種情況下,計數顯示,j溢出Integer.MAX_VALUE兩次,此時它顯然是被認爲比Integer.MAX_VALUE越大!?

這是JVM中的錯誤嗎?


如果打印語句,以防止4個十億printlns條件:

if (j > Integer.MAX_VALUE - 1) 
    System.out.println(count + " " + j); 

輸出更改爲:

101 2147483647 
230627, -2147253122, true 

第一行從第一溢出之前預期,但第二次計數對我來說是個謎。