我在一本面试准备书籍《面试算法》中看到了这个问题。但是它没有说明答案。
根据我的知识,它会返回false。我有什么遗漏吗?
我在一本面试准备书籍《面试算法》中看到了这个问题。但是它没有说明答案。
根据我的知识,它会返回false。我有什么遗漏吗?
Javascript让我想起了一个特殊的数值,Infinity
。
因此实际上这将返回true:
var x = Infinity;
alert(x == x + 1);
inf
考虑得当确实是明智的事情。同样适用于 Python 中的 float('inf')
。 - Chris Morgan>>> class X(object):
... def __eq__(self, other):
... return True
... def __add__(self, other):
... return self
...
>>> x = X()
>>> x == x + 1
True
除非问题中指定了类型(和实现),否则假设总是正确是不安全的。但由于已经指定为整数,您可以知道对于所有x,x!= x + 1
。整数被存储为一系列位,并且加1是通过切换最后一个位然后进行进位(如果它曾经是1等)完成的,这将永远不会得到相同的结果(无论整数类型有多少位,只要大于零即可)。
x == x + 1
将为true。哦,当我说“只要它大于零”时,我想我应该包括“带溢出”; 对于没有溢出的一位整数,对于 x = 1 的情况,x + 1
将为 1,因此它将为 true 而不是 false。但我从未遇到过小于四位的整数类型。我怀疑我在闲逛。 - Chris Morganx + 1 == x
,其中x = 2^(n-1)。 - Chris Morgan它应该:)
这也适用于
x = Int32.MaxValue;
result = x == x + 1;
==
运算符的优先级等于或高于 +
运算符。在这种情况下,您的表达式将扩展为 ((x == x) + 1)
,这可能会导致错误(因为您正在将 1 添加到布尔值)或评估为 2(因为在许多语言中,TRUE
等于 1
)。==
优先级等于或高于 +
。举个例子,在Java中,如果代码在多个线程中执行,x == x + 1
可能也是正确的。
这是因为另一个线程有可能同时修改x
,所以条件最终可能会变成真的。为了避免缓存,x
变量必须声明为volatile
。
当然它必须是假的,除非你按照Paul所说的去做;) x+1计算出的值比x大1。因此,例如45 == 45 + 1是错误的。在这个表达式中不会进行任何赋值。
operator==
,否则这只是一个数学上的异常。 :) - Paul Mantax
是在哪里声明的?它是否被多个线程更新?这是什么编程语言? - Op De Cirkel