我在面试准备书 - 面试算法中看到了这一点。它没有说出答案是什么。
根据我的知识,它确实返回false。我错过了什么吗?
答案 0 :(得分:12)
Javascript 出现在我的脑海中,它有一个特殊的数字值Infinity
。
所以这实际上会返回true:
var x = Infinity;
alert(x == x + 1);
答案 1 :(得分:8)
对于所有x,使用整数x != x + 1
。对于浮点数,它不能保证是真的;如果指数足够大,那么1将逐渐消失,并在尾数末尾丢失 - 这是最容易看到的最大可能指数,它使得无穷大。无限加一个是无穷大。但它也适用于较小的指数。
然后,在支持运算符重载的语言中,很有可能打破这些微不足道的数学定律。例如,在Python中,
>>> class X(object):
... def __eq__(self, other):
... return True
... def __add__(self, other):
... return self
...
>>> x = X()
>>> x == x + 1
True
除非在问题中指定了类型(和实现),否则假设它始终为true是不安全的。但是,由于已经指定它是一个整数,因此您可以知道所有x的x != x + 1
。整数存储为一系列位,并且通过切换最后一位然后携带(如果它是1 等等)来完成添加,这将永远不会得到相同的结果(无论有多少位是整数类型,只要它大于零)。
答案 2 :(得分:3)
它应该:)
也是如此
x = Int32.MaxValue;
result = x == x + 1;
答案 3 :(得分:3)
这取决于语言及其运算符优先级。 ==
运算符可能具有与+
运算符相同或更高的优先级。在这种情况下,您的表达式将扩展为((x == x) + 1)
,这可能会给出错误(因为您在布尔值中添加1)或者可以求值为2(因为在许多语言中TRUE
等于{{1 }})。
虽然1
的优先级等于或高于==
,但我不知道哪种语言(如果有的话)。
答案 4 :(得分:3)
C和C ++没有定义当它们的整数类型存储溢出的最大有符号整数值时的行为。例如,int
类型的最大合法价值称为INT_MAX
(标准标题中提供) - 这些语言不需要INT_MAX + 1
特别是任何内容,即他们不要't 需要编译器或部署环境,以确保它不会仍然是INT_MAX
。但是出于性能原因,它们极不可能(因为性能原因)为每次算术运算产生溢出而产生额外的机器代码测试......相反,它们通常会让CPU对溢出作出反应并产生任何结果。
在CPU级别,没有真正的理由让CPU在检测到潜在溢出时无法挽救,忽略添加或产生某种异常:如果后者未传播到OS / app,或被他们忽略,然后可能会看到原始值。但大多数CPU对签名类型的“+ 1”与对无符号类型的处理方式相同,C / C ++只需要将模数2^#bits
包裹起来......然后将其解释为带符号的数字取决于哪个签名号码表示正在使用中。对于某些语言和CPU,可能对BCD值进行积分运算 - 它们对溢出的反应更难以推测。
答案 5 :(得分:2)
例如,在Java中,如果代码在多个线程中执行,x == x + 1
也可能成立。
在此期间,另一个线程有可能会修改x
,因此条件可能最终为真。
必须将x
变量声明为volatile,以便不进行缓存。
答案 6 :(得分:0)
当然它必须是假的,除非你按照保罗的说法行事;)x + 1评估的某个值大于1而不是x。所以,例如45 == 45 + 1是假的。在这个表达中没有任何分配。