本次专题是尽情创造死循环!
为了得到死循环,那么就要知道怎么创造永远都不为真的条件!
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;
可以正常编译吗?
偷个懒,自行验证吧