【发布时间】:2019-04-30 04:02:52
【问题描述】:
I ran cross this puzzler from an advanced programming course at a UK university exam.
考虑以下循环,其中 i 目前尚未声明:
while (i == i + 1) {}
找到i的定义,在这个循环之前,这样while循环
永远持续下去。
下一个问题,对这段代码sn-p提出了同样的问题:
while (i != i) {}
对我来说很明显。当然,在另一种情况下,它是NaN,但我真的被困在前一种情况上。这与溢出有关吗?什么会导致这样的循环在 Java 中永远循环?
【问题讨论】:
-
是否有可能覆盖
.equals()方法?由于 i 未声明,我们可以使用任何我们想要的类。 -
@Raedwald 学习“不专业”的代码会让你更“专业”,所以……无论如何,这是个好问题
-
有趣的是,在 C# 中,这也适用于值为
null的可空数值类型,因为null == null为真,null + 1为null。 -
@EricDuminil:情况比你想象的要糟糕得多。在许多语言中,浮点运算必须至少以 double 指定的 64 位精度完成,这意味着它可以随心所欲地以更高的精度完成编译器,在实践中会发生这种情况。我可以向您指出这个站点上来自 C# 程序员的十几个问题,他们想知道为什么
0.2 + 0.1 == 0.3会根据编译器设置、月相等更改其值。 -
@EricDuminil:这个烂摊子的责任落在了英特尔身上,如果数字可以注册的话,它给了我们一个芯片组,它可以进行更高精度和 更快 浮点运算,这意味着浮点计算的结果可以根据优化器中的寄存器调度程序今天的工作情况来改变它们的值。作为语言设计者,你的选择是在可重复计算和快速、精确计算之间,关心浮点数学的社区会选择后者。