10

I saw this in an interview preparation book - Algorithms for Interviews. It did not say what the answer was.

Based on my knowledge it does return false. Am I missing something ?

4

7 回答 7

12

我想到了JavascriptInfinity ,它有一个特殊的数值。

所以这实际上将返回 true:

var x = Infinity;
alert(x == x + 1);
于 2011-07-13T06:50:38.853 回答
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

除非在问题中指定了类型(和实现),否则假设它始终为真是不安全的。但是由于它已被指定为整数,因此您可以知道x != x + 1所有 x。整数存储为一系列位,加一个是通过切换最后一位然后携带如果它是 1等等来完成的,这将永远不会得到相同的结果(无论整数类型中有多少位,只要它大于零)。

于 2011-07-13T07:02:16.087 回答
3

这取决于语言及其运算符优先级。运算符的优先级可能与==运算符相同或更高+。在这种情况下,您的表达式将扩展为((x == x) + 1)可能给出错误(因为您将 1 添加到布尔值)或可能评估为 2(因为在许多语言中TRUEequals 1)。

我不知道哪种语言(如果有的话)==具有相同或更高的优先级+

于 2011-07-13T06:56:18.930 回答
3

它应该 :)

这也适用于

x = Int32.MaxValue;
result = x == x + 1;
于 2011-07-13T06:44:04.550 回答
3

C 和 C++ 没有定义最大有符号整数值其整数类型存储溢出时的行为。例如,类型的最大合法价值int被称为INT_MAX(在标准头文件中可用) - 这些语言不需要INT_MAX + 1特别的任何东西,即它们不需要编译器或部署环境来确保它不会仍然是INT_MAX. 但是它们极不可能(出于性能原因)为每个算术运算的溢出生成额外的机器代码测试......相反,它们通常会让 CPU 对溢出做出反应并产生任何感觉的结果。

在 CPU 级别,CPU 没有真正的理由在检测到潜在溢出、忽略添加或生成某种异常时不退出:如果后者没有传播到操作系统/应用程序,或者被它们忽略,那么可能会看到原始值。但是大多数 CPU 对有符号类型的“+ 1”处理与对无符号类型的处理相同,C/C++ 需要简单地环绕模2^#bits......然后如何将其解释为有符号数取决于哪个有符号数表示正在使用中。对于某些语言和 CPU,对 BCD 值的积分运算可能是可能的——它们对溢出的反应更难推测。

于 2011-07-13T08:13:49.437 回答
2

例如,在 Java 中,x == x + 1如果代码在多个线程中执行,也可能成立。

在此期间另一个线程可能会修改x,因此条件最终可能会为真。该x变量必须声明为 volatile 以免被缓存。

于 2013-10-30T06:45:39.153 回答
0

当然它一定是假的,除非你按照保罗所说的去做;) x+1 的计算结果比 x 大 1。因此,例如 45 == 45 + 1 是错误的。在这个表达式中没有进行赋值。

于 2011-07-13T06:50:48.557 回答