2011-10-30 45 views
4

我遇到了一篇文章,提到!0的結果是依賴於編譯器的。結果可以是1或FF或FFFF等。是依賴於C的零(!0)編譯器的邏輯否定嗎?

至於C99標準6.5.3.3目算術運算符,

邏輯否定運算符的結果!如果其操作數的值與 不等於0,則其值爲0,如果其操作數的值等於0,則爲0。結果的類型爲int。表達式!E相當於(0 == E)。

它是否真的依賴於編譯器?

+10

難道你不引用標準,說它評估爲1?!所以它應該是平臺/編譯器獨立的。也許那篇文章的意思是說「〜0」是平臺依賴的。 – Shahbaz

+0

你從哪裏看到那篇文章? –

回答

10

似乎到已經回答了你自己的問題,從它指定結果必須是0或1。

這樣的標準報價,所有我能猜到是你問是否所有的C編譯器都符合這方面的標準。由於我沒有使用過任何C編譯器,所以我無法真正回答這個問題。我從來沒有使用或聽說過一個產生任何其他價值,但考慮到多年來我花在這裏,Usenet等,似乎可能,如果這樣的野獸存在,我可能會聽說過它。

編輯:這也許值得指出的是,即使以K & R1,它的具體描述爲產生0或1(§A.7.2):

邏輯非運算符的結果!如果其操作數的值爲0,則爲1,如果操作數的值不爲零,則爲0。

1

每個編譯器都應該在他們的描述中列出他們遵循的標準。 當然,這種描述並不總是完全正確的(某些編譯器包含錯誤或對標準的錯誤解釋),但是布爾的行爲非常簡單和如此之久(來自C的第一天),如果一個新的編譯器的行爲不同。

所以我一直把它作爲一個官方標準,也是一個事實標準:(!0) = 1(!1) = 0,都是int類型的。

但要小心,在C++布爾運算符中返回值爲bool,所以如果使用C++編譯,將使用bool,而不是int。然而,bool和int可以直接互換,除非某些C++編譯器會在你做一些奇怪的事情時發出警告,如bool x = 10;