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 ?
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 ?
我想到了JavascriptInfinity
,它有一个特殊的数值。
所以这实际上将返回 true:
var x = Infinity;
alert(x == x + 1);
对于整数,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等等来完成的,这将永远不会得到相同的结果(无论整数类型中有多少位,只要它大于零)。
这取决于语言及其运算符优先级。运算符的优先级可能与==
运算符相同或更高+
。在这种情况下,您的表达式将扩展为((x == x) + 1)
可能给出错误(因为您将 1 添加到布尔值)或可能评估为 2(因为在许多语言中TRUE
equals 1
)。
我不知道哪种语言(如果有的话)==
具有相同或更高的优先级+
。
它应该 :)
这也适用于
x = Int32.MaxValue;
result = x == x + 1;
C 和 C++ 没有定义最大有符号整数值其整数类型存储溢出时的行为。例如,类型的最大合法价值int
被称为INT_MAX
(在标准头文件中可用) - 这些语言不需要INT_MAX + 1
特别的任何东西,即它们不需要编译器或部署环境来确保它不会仍然是INT_MAX
. 但是它们极不可能(出于性能原因)为每个算术运算的溢出生成额外的机器代码测试......相反,它们通常会让 CPU 对溢出做出反应并产生任何感觉的结果。
在 CPU 级别,CPU 没有真正的理由在检测到潜在溢出、忽略添加或生成某种异常时不退出:如果后者没有传播到操作系统/应用程序,或者被它们忽略,那么可能会看到原始值。但是大多数 CPU 对有符号类型的“+ 1”处理与对无符号类型的处理相同,C/C++ 需要简单地环绕模2^#bits
......然后如何将其解释为有符号数取决于哪个有符号数表示正在使用中。对于某些语言和 CPU,对 BCD 值的积分运算可能是可能的——它们对溢出的反应更难推测。
例如,在 Java 中,x == x + 1
如果代码在多个线程中执行,也可能成立。
在此期间另一个线程可能会修改x
,因此条件最终可能会为真。该x
变量必须声明为 volatile 以免被缓存。
当然它一定是假的,除非你按照保罗所说的去做;) x+1 的计算结果比 x 大 1。因此,例如 45 == 45 + 1 是错误的。在这个表达式中没有进行赋值。