by沈東良/良少http://blog.csdn.net/shendl
C99標准定義了一個新的關鍵字_Bool,提供了布爾類型。以前,C程序員總是使用自己的方法定義布爾類型。
0表示false,非0表示true。
可能使用char類型表示一個布爾類型,也可能使用int類型表示一個布爾類型。
很多函數庫都定義了自己的布爾類型和相應的宏,枚舉,typedef。
現在C99把C語言原生的布爾類型帶來了。
#include<stdbool.h>
這個頭文件定義了bool,true,false等宏。
#ifndef__cplusplus
如果不是C++,是純C,那么,定義宏bool相當於_Bool類型。
#definebool _Bool
#definetrue 1
#definefalse 0
#else/* __cplusplus */
如果是C++,那么定義_Bool類型為bool類型。
/*Supporting <stdbool.h> in C++ is a GCC extension. */
#define_Bool bool
#definebool bool
#definefalse false
#definetrue true
#endif/* __cplusplus */
/*Signal that all the definitions are present. */
#define__bool_true_false_are_defined 1
看看上面這個宏是否==1,如果是,表示上面這些定義可用。
C2008草案中說:
Anobject declared as type _Boolis large enough to store the values 0 and1.
也就是說,只規定了_Bool類型的大小是至少能夠存放0和1這兩個值。並沒有規定具體的大小。這交給編譯器自由發揮了。
我用gcc做了一下測試:
printf("sizeof(bool):%d\n",sizeof(bool));
printf("sizeof(char):%d\n",sizeof(char));
printf("sizeof(int):%d\n",sizeof(int));
printf("sizeof(long):%d\n",sizeof(long));
--sizeof(bool):1
--sizeof(char):1
--sizeof(int):4
--sizeof(long):8
看來gcc是用char來實現_Bool類型的。
看看給_Bool類型賦值會怎樣:
boolboolean=-11212112;
printf("boolean:%d\n",boolean);
--boolean:1
看來,gcc編譯器對待_Bool類型有自己的轉換處理。如果是0賦值給_Bool類型,那么就賦值0。如果是任意其他數據,那么會賦值為1!(只是不知道其他編譯器是否如此處理,C2008標准草案沒有細說這個部分)
以前一直用!邏輯非運算符:
if(!flag){
}
來表示0和非0。現在_Bool類型就只有0和1這兩個值!