Java死循環的各種寫法


1

請寫一個變量聲明,將它置於下面的循環之前,使得該循環成為無限循環。

for (int i =start; i <=start+1; i++){

}

這里,start是未定義變量,我們需要定義它。

如果你非常熟悉int的話,可能能得出正確答案:

答案:int start = Integer.MAX_VALUE - 1;

解釋:因為int.MAX_VALUE + 1 = int.MIN_VALUE。

什么樣的聲明能讓下面的循環是無限循環?

while(i == i + 1){

}

答案:double i = Double.MAX_VALUE;

解釋:這樣做是因為一個浮點數值越大,它和其后繼數值之間的間隔就越大。浮點數的這種分布是用固定數量的有效位來表示它們的必然結果。對一個足夠大的浮點數加 1 不會改變它的值,因為 1 是不足以“填補它與其后繼者之間的空隙”。 

3

提供一個對i的聲明,使下面的循環是無限循環。

while(i != i){

}

答案:double i = Double.NaN;

解釋:IEEE 754 浮點算術保留了一個特殊的值用來表示一個不是數字的數量,這個值就是 NaN(“不是一個數字(Not a Number)”的縮寫),對於所有沒有良好的數字定義的浮點計算,例如 0.0/0.0,其值都是它。規范中描述道,NaN 不等於任何浮點數值,包括它自身在內。因此,如果 i 在循環開始之前被初始化為 NaN,那么終止條件測試(i != i)的計算結果就是 true,循環就永遠不會終止。很奇怪但卻是事實。  可以這樣聲明:double i = 0.0 / 0.0;
     為了表達清晰,可以使用標准類庫提供的常量: double i = Double.NaN;

4

提供一個對i的聲明,使下面的循環是無限循環。

while(i != i + 0){

}

答案:String i = "";

解釋: 注意:此題不使用浮點數。我 們必然可以得出這樣的結論,即 i 的類型必須是非數值類型的,並且這其中存在着解謎方案。唯一的 + 操作符有定義的非數值類型就是 String。+ 操作符被重載了:對於 String 類型,它執行的不是加法而是字符串連接。如果在連接中的某個操作數具有非 String 的類型,那么這個操作書就會在連接之前轉換成字符串。事實上,i 可以被初始化為任何值,只要它是 String 類型的即可,

例如:String i = "";

5

提供一個對i的聲明,使下面的循環是無限循環。

while(i != 0){

  i >>>=1;

}

答案:byte i = -1;

6

提供對i和j的聲明,使下面的循環是無限循環。

while(i <= j && j <=i && i !=j){

}

答案:Integer i = 100;
          Integer j = new Integer(100);

解釋:在 Java5.0版本及以后,<=操作符在原始數字類型集上是反對稱的,但是<=操作符在被包裝的數字類型(Byte、Character、 Short、Integer、Long、Float 和 Double)的操作數上不是反對稱的,因為 Java 的判等操作符(==和!=)在作用於對象引用時,執行的是引用ID 的比較,而不是值的比較。

7

提供一個對i的聲明,使下面的循環是無限循環。

while(i != 0 && i == -i){

}

答案:Integer i = Integer.MIN_VALUE;

解釋:可 以推斷出 i 的類型必然是整數型的。總共存在偶數個 int 數值——准確地說有2的32次方個——其中一個用來表示 0,這樣就剩些奇數個 int 數值來表示正整數和負整數,這意味着正的和負的 int 數值的數量必然不相等。這暗示着至少有一個 int數值,其負值不能正確地表示成為一個 int 數值。 

     事實上,恰恰就有一個這樣的 int 數值,它就是 Integer.MIN_VALUE,十六進制表示是 0x80000000。其符號位為 1,其余所有的位都是 0。如果我們對這個值取負值,那么我們將得到 0x7fffffff+1,也就是 0x80000000,即
Integer.MIN_VALUE!因此,Integer.MIN_VALUE 是它自己的負值,Long.MIN_VALUE 也是一樣。對這兩個值取負值將會產生溢出,但是 Java 在整數計算中忽略了溢出。

     因此可以這樣聲明:int i = Integer.MIN_VALUE; 或者:long i = Long.MIN_VALUE;

 

原文參考:http://yoyo08.iteye.com/blog/333800


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM