2010-11-23 68 views
10

在C中,除了0以外,至少每個正值都被視爲一個布爾值true。但是,負面價值呢?我做了一些測試,似乎也將負值視爲布爾真。這是一個特定的行爲或實現嗎?是否定義了負值布爾值?

(我來想想這個,當我在一個問題中看到,有人促進宣佈「真」,並在一個枚舉爲1和0「假」)

+0

所有不是`false`的都是`true`? – khachik 2010-11-23 09:11:29

+0

我認爲這個http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1會回答你的問題 – 2010-11-23 09:27:43

回答

23

這是定義的行爲。我會尋找C99標準段落說明這樣

§ 6.3.1.2
當任何標量值轉換爲_Bool,其結果是,如果 值進行比較等於0 0; 否則,結果爲1.

+2

+1指向標準。 – Jay 2010-11-23 09:19:43

+0

+1標準`bool`很好。如果特定的編譯器缺少C99支持,我使用`enum`作爲後備。 – 2010-11-23 09:20:43

1

在C中,沒有布爾類型; 0和0.0f在布爾上下文中被認爲是「假」,其他的都是「真」。

中聲明枚舉「真」與「假」是錯誤的,因爲那樣的話下面的代碼將打破:

if (2 == TRUE) 

(2應該評估爲「真」,但如果真被定義爲1 ,這兩個值不被認爲是相等的)。

2

我相信0是錯誤的,其他一切都是真實的。

見@卡斯帕的答覆這裏:thread

我會採取一個暗示從這兒用,其中虛假絕對定義爲0,而真正被定義爲不假。與絕對值相比,這是一個重要的區別。除非你有一個只有兩種狀態的類型,否則你必須考慮該值類型中的所有值,什麼是真的,什麼是錯誤的。

2

這是正確的行爲,在C 是一切

-1

C定義0爲假,一切爲真。積極,消極,無論如何。

我相信我最近主張使用typedef enum { false, true } bool;,所以我會自己去做。 (如果我原來的代碼沒有一個typedef參與,這是判斷錯誤在我的部分。)所有非零值是真實的,所以我不主張以枚舉型bool對於這樣的事情:

if(x == true) // not what you want 
if(!x == false) // works, but why so much effort? 

我通常只是簡單地按照if(x)if(!x)對布爾值進行顯式測試。但是,有時這是很好的有一個布爾類型:

bool is_something(int x) 
{ // assume for the sake of an argument that the test is reasonably complex 
    if(/* something */) return false; 
    if(/* something else */) return true; 
    return false; 
} 

這只不過是具有類型是int更好,但至少你是明確什麼結果意味着。

而且,按照別人以上,更好的bool可能是:

typedef enum { false, true = !false } bool; 

我相信!保證返回0或1,但我可能是錯的,而上述作品以及兩種方式。