2010-07-21 42 views
3

這將編譯爲什麼編譯器不能推斷大數很長?

var fourGb = (long)4*1024*1024*1024; 

但這種失敗

var fourGb = 4*1024*1024*1024; 

隨着 「操作溢出在檢查模式編譯時」。

所以如果編譯器知道這將是一個溢出,爲什麼不能推斷變量類型應該是一個很長的?

+1

因爲編譯器還是比較笨,這是一個邊緣情況?一個更好的問題是爲什麼不完全限定產生「long fourGb」的類型。 'var'只有一個字母縮短了,在這種情況下沒有提供可預見的好處 – Earlz 2010-07-21 04:46:23

+4

那麼它也可能是ulong?你希望編譯器如何明確這一點,而不是明確表示它?此外,int * int將返回一個int,因此最終值將溢出。不是嗎? – shahkalpesh 2010-07-21 04:50:12

回答

2

想象一下會引起的騷動。 「但是編譯器可以計算出一個表達式應該被評估爲很長時間,爲什麼運行時不能這樣做?」

而那不會發生,方式太貴了。

編譯器以與運行時相同的方式評估表達式至關重要。如果情況並非如此,編輯常量表達式並用變量替換常量可能會突然導致運行時失敗。很難診斷故障,默認情況下,非常量表達式未被選中。

2

我不認爲這是通過將計算結果來推斷變量的類型是一個好主意。

相關問題