Language agnostic 对于整数x,(x==x+;1)是否总是返回false?

Language agnostic 对于整数x,(x==x+;1)是否总是返回false?,language-agnostic,boolean-expression,Language Agnostic,Boolean Expression,我在一本面试准备书《面试算法》中看到了这一点。它没有说答案是什么 据我所知,它确实返回false。我遗漏了什么吗?应该是:) 对我来说也是如此 x = Int32.MaxValue; result = x == x + 1; Javascript浮现在我的脑海中,它有一个特殊的数值无穷大 因此,事实上,这将返回真值: var x = Infinity; alert(x == x + 1); 当然这一定是假的,除非你照保罗说的去做;)x+1的计算结果为大于x的某个值。例如,45==45+1为假

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

据我所知,它确实返回false。我遗漏了什么吗?

应该是:)

对我来说也是如此

x = Int32.MaxValue;
result = x == x + 1;

Javascript浮现在我的脑海中,它有一个特殊的数值
无穷大

因此,事实上,这将返回真值:

var x = Infinity;
alert(x == x + 1);

当然这一定是假的,除非你照保罗说的去做;)x+1的计算结果为大于x的某个值。例如,45==45+1为假。此表达式中不进行辅助运算。

它取决于语言及其运算符优先级。
=
运算符的优先级可能等于或高于
+
运算符。在这种情况下,您的表达式将扩展到
((x==x)+1)
,这可能会给出错误(因为您将1添加到布尔值中),也可能会计算为2(因为在许多语言中
TRUE
等于
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等),这将永远不会得到相同的结果(无论整数类型中有多少位,只要它大于零)

< P> C和C++没有定义当最大积分值的积分类型存储溢出时的行为。例如,类型
int
的最大法定值被称为
int\u MAX
(在标准标题中提供)-这些语言不要求
int\u MAX+1
是任何特定的东西,也就是说,它们不需要编译器或部署环境来确保它不会仍然是
int\u MAX
。但他们极不可能(出于性能原因)生成额外的机器代码测试每个算术运算的溢出。。。相反,它们通常会让CPU对溢出做出反应,并产生它感觉到的任何结果


在CPU级别,没有真正的理由让CPU在检测到潜在溢出时不退出,忽略添加或生成某种方式的异常:如果后者没有传播到OS/应用程序,或被它们忽略,则可能会看到原始值。但大多数CPU对有符号类型的处理方式与对无符号类型的处理方式相同,C/C++只需将模
2^#位
。。。如何将其解释为带符号的数字取决于使用的是哪种带符号的数字表示。对于某些语言和CPU,BCD值上的整数运算可能是可能的——它们对溢出的反应更难推测。

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

同时,另一个线程可能会修改
x
,因此该条件最终可能为真。
x
变量必须声明为volatile才能缓存。

除非重载
运算符==
。。。否则,这只是一个数学上的偏差。:)大概是“不”,否则这将是一个毫无意义的问题!:)其中声明了
x
?它是由多个线程更新的吗?这是什么语言?什么编程语言???在执行饱和加法的机器上可能是这样。尽管优化器会跳过实际测试(整数溢出被认为是UB)。用什么编程语言?好问题。我的猜测是.NET/C,但你是对的,语言可能是解决方案。也许在一种特定的语言中,在某些情况下有一种意想不到的行为:代码> INF确实是一件明智的事情。Python中的
float('inf')
也是如此,但请记住
Infinity
在JavaScript中是一个
number
;JavaScript没有整数类型的概念。而
无穷
被实现为一个具有最大指数的浮点数,因此它不是整数。但问题明确地说是“整数”。从上一个想法开始,“假设它大于零”,如果您碰巧使用了一个奇怪的integer实现,它希望为您节省内存,并且恰好是零位(根本不使用内存!),
x==x+1
。哦,当我说“如果它大于零”,我想我应该包括“带溢出”;对于没有溢出的一位整数,
x+1
对于x=1将是1,因此它将是true而不是false。但我从未遇到过小于4位的整数类型。我怀疑我是在轻浮。等等,一点?如果不使用溢出,为什么长度很重要?在一个没有溢出和错误的实现中,它有可能被实现为x=2^(n-1)的
x+1==x
。但我想不出是什么,不是那样的。我从来没用过