是(x == x + 1)总是为整数x返回false?

use*_*925 10 language-agnostic boolean-expression

我在面试准备书 - 面试算法中看到了这一点.它没有说出答案是什么.

根据我的知识,它确实返回错误.我错过了什么吗?

kap*_*apa 12

Javascript浮现在我的脑海中,它有一个特殊的数字值Infinity.

所以这实际上将返回true:

var x = Infinity;
alert(x == x + 1);
Run Code Online (Sandbox Code Playgroud)

  • `inf`确实是一个明智的选择.Python中的`float('inf')`也是如此. (2认同)
  • 但请记住,`Infinity`是JavaScript中的"数字"; JavaScript没有整数类型的概念.并且`Infinity`被实现为具有最大指数的浮点数,因此它不是整数. (2认同)
  • 这个问题确实特别说"整数". (2认同)

Chr*_*gan 8

x != x + 1对于所有x ,使用整数.对于浮点数,它不能保证是真的; 如果指数足够大,那么1将逐渐消失,并在尾数末尾丢失 - 这是最容易看到的最大可能指数,它使得无穷大.无限加一个是无穷大.但它也适用于较小的指数.

然后,在支持运算符重载的语言中,很有可能打破这些微不足道的数学定律.例如,在Python中,

>>> class X(object):
...    def __eq__(self, other):
...        return True
...    def __add__(self, other):
...        return self
...
>>> x = X()
>>> x == x + 1
True
Run Code Online (Sandbox Code Playgroud)

除非在问题中指定了类型(和实现),否则假设它始终为true是不安全的.但是因为已经指定它是一个整数,你可以知道x != x + 1所有的x.整数存储为一系列位,并且增加一个是通过切换的最后一位,然后携带,如果它已经做了1 等等,这将永远不会得到相同的结果(无论有多少位有在整数类型,提供它大于零).


Boa*_*ler 3

它应该 :)

这也适用于

x = Int32.MaxValue;
result = x == x + 1;
Run Code Online (Sandbox Code Playgroud)