循环之谜
本次專題是盡情創造死循環!
為了得到死循環,那么就要知道怎么創造永遠都不為真的條件!
1、boolean值
while(true);
2、自增運算符
有沒有可能一個值自增之后就小于它本身呢?
這是可能的?永遠記住計算機中的整數類型是由范圍的,有可能出現最大值+1然后退化成最小值了,
比如Integer.MAX_Value+1 = Integer.MIN_VALUE;想想是不是?
下面的循環也是合理的。
for(int i = Interger.MAX_VALUE - 1; ?i <= Integer.MAX_VALUE;i++){
}
3、在java中,有多少種實數呢?有int,long,float,double,NaN,無窮大,無窮小,等
特殊浮點數:
Double.POSITIVE_INFINITY: 獲得途徑->1.0/0
Double.NEGATIVE_INFINITY: 獲得途徑->-1.0/0
NaN: 獲得途徑->0.0/0
注意整數除以0是非法的
那么好了,都知道,無窮大+1=無窮大
所以有了下面的程序也是符合要求的
double d = 1.0/0;
while(d==d+1){
}
4、NaN不等于任何浮點值,包括它本身
double d = 0.0/0.0
while(d != d)
5、自動包裝和自動拆包
這個也能嗎?
我們看一條規則:
當兩個操作數都是被包裝的數字類型時,數值比較操作符和判等操作符的行為存在著根本的差異,數值比較操作符執行的是值比較,而判等操作符執行的是引用標識的比較。當其中一個是包裝類型,一個是基本類型,那么執行拆包。
也就說System.out.println(new Integer(0) == new Integer(0))輸出的是false;System.out.println(new Integer(0) == 0)輸出為true;
那么觀察下面代碼:
Integer i = new Integer(0);
Integer j = new Integer(0);
while(i<=j && j<= i && i != j){}
6、“+”在運算過程,不僅僅是加法,還能表示連接。
while(i != i + 0){}
如何定義可以使之成為死循環呢?
String i = "dsagas";
注意:一個東西加上0不一定等于本身。
7、聲明i使得下面的循環是死循環
while(i!=0 && i=-i){}
怎么可能?一個數不是0還能等于其負數?這樣的數存在嗎?
在數學上,不存在。但是在計算機界卻是可能的。
我們都知道整型中,負數比正數多一個數,那么這個數是哪一個呢?是能表示的最小數。而除了0,其他的數都是正負對應的。
int i = Integer.MIN_VALUE;
while(i != 0 && i = -i){};
8、這次不使用無窮大是否可以實現死循環呢?
int start = 2000000000;
float f=start;
while(f == (start + 50)){}
9、回頭再看第七,然后運行下面的程序
import java.util.*;
public class Test{
public static void main(String[] args){
? ? ? short b = Short.MIN_VALUE;
? ? ? System.out.println(b == -b);
}
}
結果發現輸出的是false
import java.util.*;
public class Test{
public static void main(String[] args){
? ? ? ?int b = Integer.MIN_VALUE;
?? ? ? System.out.println(b == -b);
}
}
輸出為true
怎么回事?
在第一道程序里,-b=32768,超出了short的表示范圍,然后就提升成了int型。如果再輸出語句中改成b==(short)(-b),就會輸出true了
for(byte b = Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++){
if(b == 0x90){
System.out.println("Joy");
}
}
那么考慮,會輸出Joy嗎?
在這里需要注意的是0x90是int常量,因此需要將b提升為int型在比較,而0x90表示144,顯然就不會有相等的那一天。
下面的賦值語句
byte b = 0x80;
可以正常編譯嗎?
偷個懶,自行驗證吧
總結
- 上一篇: uniapp获取用户登录信息的实现
- 下一篇: 推荐的网站