什么声明可以使下面的循环变成无限循环?

6

将变量i的声明放在第三行,使循环变成无限循环。

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

听起来像是突发测试。 - Baby
抱歉,我不理解这个问题。 - Scary Wombat
我认为这个问题更适合于编程谜题和代码高尔夫,因为它是一个谜题。 - Ferrybig
不是啊,这只是个人的作业。所以他匿名提问,这样他的老师就不会发现他在论文中抄袭了一个Stack Overflow用户的答案。 - Damien Overeem
任何大的浮点数都可以使用,我猜无需是无穷大。由于不可能存储这样的精度,它将只存储相同的值。例如:1e100 + 1 == 1e100 - Caramiriel
3个回答

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
还有 -无穷大 + 1 == - 无穷大 :D - Maroun

9
double i=1/0.0;

它会使循环变成无限的。

1
它会抛出除以零的异常,不是吗? - Android Killer
@AndroidKiller 不,它不会。 - Maroun
@AndroidKiller,没有例外,我变成了无穷大。 - swapnil7
1
@MarounMaroun 好的,但是为什么?如果你能解释一下会更有帮助。因为这种类型的代码通常会抛出这种类型的异常,对吧?我也曾遇到过除以零的异常。 - Android Killer
3
@AndroidKiller double可以表示无穷大,而int不行。如果你执行int i = 1 / 0;,会抛出异常。 - Maroun
1
@AndroidKiller 这是因为整数没有+/-Inf、NaN的值,也不允许除以0,而浮点数具有这些特殊值。 - loknath

1
如果循环条件保持为真,则while循环是无限的。由于表达式仅依赖于 i ,而 i 在循环体中未被分配,因此与在第一次评估时循环条件为真等价。

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

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上,最接近的浮点数(或双精度浮点数)被作为结果。该浮点数(或双精度浮点数)是否与初始值不同取决于围绕c的浮点值的密度。在内部,浮点类型由一个符号位和两个固定的整数m和e表示,其中浮点的值由s * m * 2 ^ e给出。
        • 添加1不太可能改变e(如果确实这样做,则结果肯定是不同的)。否则:
          • 如果e <= 0,则添加1将更改m
          • 如果e == 1,则添加1可能更改m,取决于舍入模式
          • 如果e> 1,则添加1不会更改m,因此c + 1 == c。现在,对于哪些值会发生这种情况?
            • 对于float,m <2 ^ 24。因此,如果c> = 2 ^ 25c <=-(2 ^ 25),则e> 1
            • 对于double,m <2 ^ 53。因此,如果c> = 2 ^ 54c <=-(2 ^ 54),则e> 1
这应该是所有情况 :-)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接