Java 什么声明将下面的循环转换为无限循环?

Java 什么声明将下面的循环转换为无限循环?,java,loops,Java,Loops,将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"); } } 它将在无限中旋转循环,数学说,无限+1==无限,

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

它将在无限中旋转循环,数学说,无限+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");

如果循环条件保持为真,则while循环是无限的。由于表达式仅依赖于
i
,并且在循环体中未指定
i
,这相当于循环条件在第一次求值时为真

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

Java有以下类型:

  • 引用类型:不支持
    +
    运算符,字符串除外,字符串通过缩合“1”而变长,因此不能保持相同
  • 基本类型:
    • 布尔值:不支持
      +
    • 整数类型:即使在溢出的情况下,加1也保证改变值
    • 浮点类型:浮点类型的浮点为:
      • 正0:0-+1等于1,因此!=0
      • 负0:0++1是1,因此!=0
      • 楠:楠+1是楠,但楠!=楠
      • 正无穷大:inf++1是inf+,因此==inf+
      • 负无穷大:inf-+1是inf-,因此==inf-
      • 正常:c+1不是一个精确的计算。粗略地说,将1与c相加,并取与该值最近的浮点(或双精度)作为结果。浮点(或双精度)是否与初始值不同取决于c周围浮点值的密度。在内部,浮点类型由一个符号位表示,两个用整数m和e固定,其中浮点值由s*m*2^e给出。
        • 添加1不太可能改变e(如果它改变了,结果无论如何是不同的)。否则:
          • 如果e1,加1不会改变m,因此c+1==c。现在,对于哪些值会发生这种情况?

            • 对于浮动,m<2^24。因此,如果c>=2^25c>=2^54c,则e>1听起来像是突击测验。对不起,我不理解这个问题。我认为这个问题更适合这个问题,因为它是一个难题。不。这只是男人们的家庭作业。这就是他匿名提问的原因,这样他的老师就不会发现他在论文中复制/粘贴了so用户的答案;不一定是无限的。因为不可能存储这样的精度,所以它只存储相同的值。ie:
              1e100+1==1e100
              它将抛出被零分隔的异常?不是吗?@AndroidKiller不,不是的@Marounnaroun好的,但为什么?如果你能解释的话,这将是有益的。因为这种类型的代码通常会引发这种类型的异常,对吗?我也面对过一次。偏离零度exception@AndroidKiller
              double
              可以表示无穷大,
              int
              不能。如果执行
              inti=1/0,则会出现异常
              @AndroidKiller这是因为整数没有+/-Inf,NaN的值,并且不允许被0除,而浮点数有这些特殊值。另外
              -infinity+1==-infinity
              :D
              // 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");