2011-07-13 71 views
9

我在採訪準備書 - 面試算法中看到了這一點。它沒有說出答案是什麼。對於整數x,(x == x + 1)總是返回false?

根據我的知識它確實會返回false。我錯過了什麼嗎?

+3

除非你重載'operator =='......否則它只是一個數學畸變。 :) –

+0

大概'不',否則這將是一個毫無意義的問題! :) –

+0

聲明哪裏'x'?它是否由多個線程更新?這是什麼語言? –

回答

3

應該:)

這也是事實爲

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

用什麼編程語言? –

+0

@Paul,看起來像C#。 –

+0

好問題。我的猜測是.NET/C# 但您的權利,語言可能是解決方案。也許在某種特定語言下,在某些情況下會出現意想不到的行爲 –

12

的Javascript在我腦海中,它有一個特殊的數值Infinity

因此,這實際上將返回true:

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

好點。我們不應該忘記極端的情況。 – Nickolodeon

+2

'inf'確實是一個明智的選擇。 Python中的float('inf')'也一樣。 –

+2

但請記住'Infinity'是JavaScript中的一個數字; JavaScript沒有整數類型的概念。並且'Infinity'被實現爲指數最大的浮點數,所以它不是一個整數。 –

0

當然這一定是假的,除非你做保羅所說的話;)X + 1計算爲一定值,該值大於1小於x。所以,例如45 == 45 + 1是錯誤的。在這個表達中沒有發生任何分派。

3

它取決於語言和它的運算符優先級。 ==運算符有可能與+運算符具有相同或更高的優先級。在這種情況下,您的表達式將擴展爲((x == x) + 1),這可能會給出錯誤(因爲您將1添加到布爾值)或可能評估爲2(因爲在很多語言中TRUE等於1)。

但我不知道==+具有相同或更高優先級的語言(如果有的話)。

+0

我遇到過一個從左到右的實現,沒有優先級的概念,爲此,這是事實。不過,想不到它是什麼。 –

+0

@chris:想起Smalltalk。 –

+0

好吧,那不是。我從未使用過它。 –

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 

除非在問題中指定了類型(和實現),否則假設它始終爲真是不安全的。但是因爲已經指定它是一個整數,你可以知道所有x都是x != x + 1。整數被存儲爲一系列位,並且通過切換最後一位並且然後攜帶(如果它已經被執行)來完成,其將不會得到相同的結果(不管整數類型中有多少位,只要它大於零)。

+0

從最後一個想法開始,「假設它大於零」,如果您碰巧使用了一個奇怪的整數實現,它希望爲您節省內存並恰好是零位(根本不使用內存!), 'x == x + 1'將會是*真*。哦,當我說「提供大於零」時,我想我應該包含「溢出」;用一個不帶溢出的整數,對於x = 1,'x + 1'將是1,所以它是真實的而不是錯誤的。但我從來沒有遇到過小於4位的整數類型。我懷疑我是輕浮的。 –

+0

等一下?爲什麼長度很重要,如果你不使用溢出?在一個沒有溢出且沒有錯誤的實現中,它有可能被實現,因此x = 2 ^(n-1)時x + 1 == x。 –

3

C和C++沒有定義當最大有符號整數值的整數類型存儲溢出時的行爲。例如,int類型的最大合法值被稱爲INT_MAX(可在標準頭文件中找到) - 這些語言不需要INT_MAX + 1是特別的東西,即它們不需要要求編譯器或部署環境來確保它將不會仍然是INT_MAX。但是他們極不可能(出於性能原因)爲每次算術運算的溢出生成額外的機器代碼測試......相反,他們通常會讓CPU對溢出做出反應併產生任何結果。

在CPU層面上,沒有真正的原因讓CPU在檢測到潛在溢出時無法擺脫困境,忽略附加或產生某種方式的異常:如果後者沒有傳播到OS /應用程序,或者被忽略他們,那麼可能會看到原來的價值。但是大多數CPU將帶符號類型的「+ 1」視爲與無符號類型相同,C/C++只需簡單地包裝模數2^#bits ......然後將其解釋爲有符號數取決於哪些有符號數申述正在使用中。對於某些語言和CPU,BCD值的積分操作可能是可能的 - 它們如何對溢出做出反應更難以推測。

2

在Java中,例如,如果代碼在多個線程中執行,則x == x + 1也可能爲真。

在此期間另一個線程可能會修改x,所以這種情況可能會最終成立。 爲了不被緩存,必須聲明變量x

相關問題