Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当(i==i&x2B;1){}永远循环时,i的值是多少?_Java_Loops_Types - Fatal编程技术网

Java 当(i==i&x2B;1){}永远循环时,i的值是多少?

Java 当(i==i&x2B;1){}永远循环时,i的值是多少?,java,loops,types,Java,Loops,Types,考虑以下循环,到目前为止,我还没有声明: while (i == i + 1) {} 查找此循环前面的i的定义,例如while循环 永远持续下去 下一个问题与此代码段的问题相同: while (i != i) {} 这对我来说是显而易见的。当然,在另一种情况下,它是NaN,但我真的被前一种情况卡住了。这与溢出有关吗?什么会导致这样一个循环在Java中永远循环?首先,因为while(i==i+1){}循环不会改变i的值,使这个循环无限等于选择一个满足i==i+1的i值 有许多这样的价值观: 让

考虑以下循环,到目前为止,我还没有声明:

while (i == i + 1) {}
查找此循环前面的
i
的定义,例如while循环 永远持续下去

下一个问题与此代码段的问题相同:

while (i != i) {}

这对我来说是显而易见的。当然,在另一种情况下,它是
NaN
,但我真的被前一种情况卡住了。这与溢出有关吗?什么会导致这样一个循环在Java中永远循环?

首先,因为
while(i==i+1){}
循环不会改变
i
的值,使这个循环无限等于选择一个满足
i==i+1
i

有许多这样的价值观:

让我们从“异国情调”开始:

这些值满足
i==i+1
的原因在
中说明:

无限和有限值之和等于无限操作数

这并不奇怪,因为将有限值添加到无限值中会产生无限值

也就是说,满足
i==i+1
i
的大多数值都是大的
double
(或
float
)值:

例如:

double i = Double.MAX_VALUE;


double
float
类型的精度有限,因此,如果取一个足够大的
double
float
值,向其添加
1
将得到相同的值。

这些难题在“Java难题:陷阱、陷阱和角落案例”中有详细描述约书亚·布洛赫和尼尔·加夫特的书

double i = Double.POSITIVE_INFINITY;
while (i == i + 1) {}
或:

两者都将导致无限循环,因为将
1
添加到足够大的浮点值不会更改该值,因为它不会“弥合”与其成功者1之间的差距

关于第二个谜题的说明(供未来读者阅读):

也会导致无限循环,因为NaN不等于任何浮点值,包括其自身2


1-Java谜题:陷阱、陷阱和角落案例(第4章-循环谜题)


2-

只是一个想法:布尔人呢

bool i = TRUE;

这不是一种情况吗,
i+1==i

double i=double.POSITIVE_无穷大

是否可以重写
.equals()
方法?因为我没有声明,我们可以使用我们想要的任何类。@Raedwald学习“非专业”代码会让你更“专业”,所以。。。无论如何,这是一个好问题。事实上,在C语言中,这也适用于值为
null
的可空数值类型,因为
null==null
是真的,
null+1
null
@EricDuminil:情况比你想象的要糟糕得多。在许多语言中,浮点运算必须至少以double指定的64位精度完成,这意味着编译器可以随心所欲地以更高的精度完成,在实践中,这种情况会发生。我可以在这个网站上向你提出十几个C#程序员提出的问题,他们想知道为什么
0.2+0.1==0.3
会根据编译器设置、月相等改变它的值。@EricDuminil:造成这种混乱的责任在于英特尔,谁给了我们一个芯片组,如果数字可以注册,它可以实现更高的精度和更快的浮点运算,这意味着浮点计算的结果可以根据优化器中寄存器调度器的工作情况改变它们的值。作为一名语言设计师,您的选择是在可重复计算和快速、精确计算之间进行,关心浮点数学的社区将选择后者(1L@Ruslan:任何数学家都会不同意。浮点数没有什么意义。它们是非关联、非自反的(NaN!=NaN),甚至不可替代(-0==0,但1/0!=1/-0)。因此,大多数代数机制都不适用。@Kevin虽然浮点数在一般情况下没有太多意义,但无穷大的行为(这就是那句话中描述的)是有意义的。@Kevin公平地说,如果你处理无穷大或未定义的值,你也不能假设你在代数中列出的属性。@Kevin:IMHO,如果浮点数学取代了“正零和负零”符号、正零、负零和无符号的概念,那么浮点数学可能会更有意义“无穷小”和一个“真零”",并使NaN等于自身。在所有情况下,真零都可以表现为加法恒等式,而涉及无穷小除法的某些运算将失去对假设无穷小为正的偏见。这取决于语言。许多语言在与int组合时会自动强制布尔数为int。其他语言也会这样做ou suggest-将int强制为布尔值。此问题是Java问题,您的建议不会通过Java编译(Java没有将
+
布尔值和
int
作为操作数的
+
运算符)@ Eran:这是运算符重载的全部概念。可以使java布尔值像C++一样运行。除了java不支持操作符重载,所以你不能。
double i = 1000000000000000000.0;
float i = 1000000000000000000.0f;
double i = Double.POSITIVE_INFINITY;
while (i == i + 1) {}
double i = 1.0e40;
while (i == i + 1) {}
double i = Double.NaN;
while (i != i) {}
bool i = TRUE;