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

时间:2011-07-13 06:39:25

标签: language-agnostic boolean-expression

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

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

7 个答案:

答案 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是假的。在这个表达中没有任何分配。