2011-10-07 49 views
19

例如,當我在C中編寫7>1(如果C99不是一直以來的特性,那麼說C99),我可以期待結果恰好是1還是隻是一個非零值?這對所有bool操作員都適用嗎?是>,<,!,&&,||的「真」結果或==定義?

+3

這是最有可能是重複的,但我不能夠找到它:-( – mbq

+3

@TRD:不正確.C表達式'7> 1'產生類型爲'int'的結果,值爲' –

回答

35

在C99§6.5.8關係運算符,項目6(<><=>=):

每個運營商<(小於),>(大於)的,< =(小於或等於),和> = (大於或等於)應得到如果指定的關係爲真和如果是假的) 結果具有類型INT

至於相等運算,它有點進一步在§6.5.9(==!=):

的==(等於),=(不等於)運算符是類似到關係 運算符,但其優先級較低)每個運算符產生如果 指定的關係爲真,並且如果它爲假。結果有int。對於任何一對 操作數,其中一個關係是正確的。

邏輯AND和OR的邏輯還沒有有點進一步§6.5.13(&&

的& &操作者應得到如果兩個操作數的比較不等於0;否則,它 產量。結果有int

...和§6.5.14(||

的||如果其任一操作數比較不等於0,則操作員應產生;否則,它 產量。結果有int

而一元算術運算符!的語義超過在§6.5.3.3/ 4:

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

結果類型是int全線,與01作爲可能的值。 (除非我錯過了一些。)

+6

並且很方便stdbool.h將true和false定義爲1和0 (C99 7.16) – Lundin

+0

好,特別是因爲&&和||在其他語言中表現不同(返回最後一個評估值)如果不包含標準操作符,可以使用'!!'或[cast to '''bool'](http://www.jacquesf.com/2011/04/in-defense-of-the-c99-boolean-type/)。 – Tobu

14

C遵循Postel's Law的布爾運算符:在你做的事情上要保守,在你接受別人的事情時要保持自由。它將在布爾表達式中將任何非零值視爲true,但它本身始終會生成0或1。 2 != 3始終是1

+0

提及Postel定律+1 – glglgl

6

從ISO C99標準,部分6.5.8:

6每個運營商<(小於)的,>(大於),< =(小於 或等於),和> =(大於或等於)應該在 指定的關係爲真時產生1,如果爲假,則爲0。結果有 int類型。

從節6.5.9:

3 ==(等於),=(不等於)運算符類似於 除了它們的低優先級的關係運算符。如果指定的關係爲真,則運算符的每個 產生1,如果 爲假,則爲0。結果的類型爲int。對於任何一對操作數, 恰恰是其中一個關係是真實的。

運算符與邏輯連接(&&)和析取(||)運算符發生同樣的事情。附註:這就是爲什麼按位運算符(&|)通常可用作邏輯運算符的非短路版本。

4

所有的C 運營,其產生邏輯真/假值總是產生int類型的結果,其值爲0爲假,1爲真。

對於所有產生邏輯真/假值的C 表達式,情況並非如此。例如,如果條件爲假,則在<ctype.h>isdigit(),isupper()等)中聲明的is*()字符分類函數將返回0,但如果條件爲真,則可能會返回任何非零值。

只要你直接使用結果作爲條件:

if (isdigit(c)) ... 
if (!isdigit(c)) ... 
if (isdigit(c) || islower(c)) ... 

試圖把它比作什麼:

if (isdigit(c) == 1) ... /* WRONG */ 
if (isdigit(c) == true) ... /* ALSO WRONG */ 

這應該不會造成任何問題。

(您可以安全的結果比較0false,但沒有很好的理由這樣做,這就是!操作是什麼。)

相關問題