【问题标题】:What declaration turns the below loop into infinite loop?什么声明将下面的循环变成无限循环?
【发布时间】:2014-03-06 06:24:44
【问题描述】:

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");
    }
}

【问题讨论】:

  • 听起来像小测验。
  • 对不起,我不明白这个问题。
  • 我认为这个问题更适合Programming Puzzles and Code Golf,因为它是一个谜。
  • 不。这只是男生的功课。这就是他匿名提问的原因,所以他的老师不会发现他在论文中复制/粘贴了 SO 用户的答案。
  • 我猜任何大的浮点数都可以工作;不一定是无穷大。由于不可能存储这样的精度,它只会存储相同的值。即:1e100 + 1 == 1e100

标签: java loops


【解决方案1】:

数学说,无穷大 + 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");

【讨论】:

  • 还有-infinity + 1 == - infinity:D
【解决方案2】:
double i=1/0.0;

它将无限循环

【讨论】:

  • 它会抛出除以零的异常吗?不是吗?
  • @AndroidKiller 不,它没有。
  • @MarounMaroun 好的,但是为什么呢?如果你能解释一下,那将会很有帮助。因为这种类型的代码一般会抛出这种类型的异常,对吧?我也遇到过一次。除零异常
  • @AndroidKiller double可以表达infinityint不能。如果你这样做int i = 1 / 0;,你会得到一个例外。
  • @AndroidKiller 那是因为整数没有 +/-Inf、NaN 的值,并且不允许除以 0,而浮点数确实有这些特殊值。
【解决方案3】:

如果循环条件保持为真,则 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
          • 如果 e == 1,加 1 可能改变 m,取决于舍入模式
          • 如果 e > 1,加 1 不会改变 m,因此 c + 1 == c。现在,这将发生在哪些值上?
            • 对于float,m c >= 2^25 或 c ,则 e > 1
            • 对于double,m c >= 2^54 或 c ,则 e > 1

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

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2012-10-20
    • 2016-03-08
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多