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