什么声明将下面的循环变成无限循环?

时间:2014-03-06 06:24:45

标签: java

i的声明放在第3行,以便循环变为无限循环。

public class Puzzel3 {
    public static void main(String[] args) {
        // Line 3
        while (i == i + 1) {
            System.out.println(i);
        }
        System.out.println("done");
    }
}

3 个答案:

答案 0 :(得分:17)

数学说,无限 + 1 == 无限,所以

// The declaration required
double i = Double.POSITIVE_INFINITY;

// It's infinite loop now...
while (i == i + 1) {
  System.out.println(i);
}

System.out.println("done");

答案 1 :(得分:9)

double i=1/0.0;

它将循环无限

答案 2 :(得分:1)

如果循环条件保持为真,则while循环是无限的。由于表达式仅取决于i,并且未在循环体中分配i,这相当于首次评估时循环条件为真。

因此,问题是表达式i == i + 1的哪些类型的值为true。

Java具有以下类型:

  • 引用类型:不支持+运算符,但字符串除外,它通过连接“1”而变得更长,因此不能保持相同。
  • 原始类型:
    • 布尔值:不支持+
    • 整数类型:即使溢出
    • ,也可以保证添加1更改值
    • 浮点类型:浮点类型的浮点数是:
      • 正0:0- + 1为1,因此!= 0
      • 负0:0+ + 1是1,因此!= 0
      • NaN:NaN + 1是NaN,但是NaN + = NaN +
      • 正无穷:inf + + 1是inf +,因此== inf +
      • 负无穷大:inf- + 1是inf-,因此== inf -
      • 正常:c + 1不是准确的计算。粗略地说,将1添加到c,并将与该值最接近的float(或double)作为结果。浮点(或双精度)是否与初始值不同取决于c周围浮点值的密度。在内部,浮点类型由符号位表示,两个固定用整数m和e表示,其中float的值由s * m * 2 ^ e给出。
        • 添加1将不太可能改变e(如果确实如此,结果仍然是不同的)。除此以外:
          • 如果e <= 0,则添加1将改变m
          • 如果e == 1,则添加1 可能更改m,,具体取决于舍入模式
          • 如果e&gt; 1,加1不会改变m,因此c + 1 == c。现在,这会出现哪些值?
            • 对于float,m&lt; 2 ^ 24。因此,e> 1如果 c> = 2 ^ 25 c <= - (2 ^ 25)
            • 对于double,m&lt; 2 ^ 53。因此,e> 1如果 c> = 2 ^ 54 c&lt; = - (2 ^ 54)

那些应该是所有情况: - )