1
请写一个变量声明,将它置于下面的循环之前,使得该循环成为无限循环。
for (int i =start; i <=start+1; i++){
}
这里,start是未定义变量,我们需要定义它。
如果你非常熟悉int的话,可能能得出正确答案:
答案:int start = Integer.MAX_VALUE - 1;
解释:因为int.MAX_VALUE + 1 = int.MIN_VALUE。
2
什么样的声明能让下面的循环是无限循环?
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;