2014-09-06 65 views
1

TRUE/FALSE通常在C中定義如下。這些定義是由各種編譯器實現支持的C標準的一部分嗎?是C標準的TRUE/FALSE部分嗎?

#define TRUE 1 
#define FALSE 0 
+1

http://en.wikipedia.org/wiki/De_facto_standard – 2014-09-06 02:37:56

+1

@MarkRansom:幾乎沒有。一些(國際海事組織,風格非常糟糕)C代碼使用這樣的宏。但它遠沒有普及。而且默認情況下,他們只能在某些Windows編譯器中使用各種非標準東西,並且可以爲隨機嵌入式系統使用各種低質量編譯器等等.-) – 2014-09-06 02:52:03

回答

8

否,對於TRUEFALSE。如果您包含<stdbool.h>,則在C99中爲truefalse可以。

+0

Dude我將編輯:你先做了 – Enumy 2014-09-06 01:55:29

0

C99和C11定義了一個帶有布爾語義的整數類型_Bool,但是沒有真正的關鍵字存在。

_Bool類型僅能夠存儲的值1和0,不比較等於0轉換爲1的任何值,並進行比較的任何值等於0被轉換爲0

通過包括<stdbool.h>_Bool類型允許寫爲bool,與其他一些語言一樣,而truefalse C預處理器宏分別定義爲1和0。

在此之前,這是一個方便的有些人來定義諸如

#define TRUE 1 
#define FALSE 0 
typedef char BOOL; /* or #define BOOL char */ 

或有時

typedef enum {False, True} BOOL; 

不同於C99常量,然而,無論是至少有一個缺陷:

BOOL bClicked = False; 

++bClicked, ++bClicked; 

if (bClicked == False) 
    printf ("False\n"); 
else if (bClicked == True) 
    printf ("True\n"); 
else 
    printf ("Unknown: %d\n", bClicked); 

這將打印「未知:2」,因爲定義的BOOL類型不是一個真正的布爾類型。

的C99版:

_Bool bClicked = 0; 

++bClicked, ++bClicked; 

if (bClicked == 0) 
    printf ("False\n"); 
else if (bClicked == 1) 
    printf ("True\n"); 
else 
    printf ("Unknown: %d\n", bClicked); 

,將打印「真」,因爲_Bool只能存儲0和1,所以遞增1拿到2,與之相比,不等於0,結果在1

當然,大多數人只是使用的語言,他們的優勢,而不是實際的比較對真/假常數:

if (bClicked) 
    { 
    /* True if bClicked does not compare equal to 0 */ 
    } 
else 
    { 
    /* False */ 
    } 

因爲那b的行爲,對布爾類型或真/假常量沒有真正的需求;它們純粹是爲了表示意圖而存在。

我依稀記得有人在咆哮,某些Windows API函數返回BOOL類型的值,但TRUEFALSE不是唯一可能的返回值,所以儘管回國應該是一個簡單的比較,因爲在這最後的值有點代碼,需要更多的比較來處理所有可能的情況。如果當時有一個實際的布爾類型,那麼最有可能的是這些函數,不管它們是否會返回值爲int的值。 A BOOL返回類型表明只有兩個值可以返回,但顯然那些函數不是這種情況,可能是因爲有第三個(錯誤)返回值。