傳統(指C90)C標准中是沒有布爾類型的,對於C來說,非0即是真,而0即是假,這里0不僅包括整型家族的0,還包括浮點家族的0.0,有如下代碼,
1 if (0.0){ 2 puts("true"); 3 }else{ 4 puts("false"); 5 }
輸出的結果是:false
在C中,一直使用int類型表示真假值(布爾值),所以,任何條件表達式的結果要么是1(真),要么是0(假),在C99標准中,引入了新的類型_Bool,即布爾類型,布爾類型的變量只能存儲1或0的整型值,把任何假值(整型和浮點的零值)賦值給_Bool,該變量會被設為0,否則被設為1,為此,C99還提供了stdbool.h頭文件,該文件讓bool成為_Bool的別名,同時宏定義了true和false,分別是1和0的字面量,這讓寫出的代碼能與C++兼容,因為C++把true和false視作關鍵字,下面對_Bool類型的一些測試代碼,
1 #include <stdio.h> 2 #include <stdbool.h> 3 4 int main(){ 5 _Bool flag=true; 6 printf("sizeof flag = %d\n",sizeof flag); 7 printf("type of flag is %s\n",_Generic(flag,int:"int",_Bool:"_Bool",default:"default")); 8 printf("the conditional expression of C language is %s\n",_Generic(2>3,int:"int",_Bool:"_Bool",default:"default")); 9 printf("the conditional expression of C language is %s\n",_Generic(flag==false,int:"int",_Bool:"_Bool",default:"default")); 10 return 0; 11 }
輸出結果:
sizeof flag = 1
type of flag is _Bool
the conditional expression of C language is int
the conditional expression of C language is int
需要注意:以上代碼使用了C11的泛型表達式_Generic(簡單地說,它接受若干參數,第一個參數必須是一個符合C語言的表達式,然后會根據提供的這個表達式的類型去匹配后面給出的類型,最后,整個_Generic表達式的值就是匹配成功項冒號后面的值),所以需要對編譯器開啟-std=c11標記。
分析輸出的3行結果的含義:
1.這說明了_Bool類型占用1字節,對於布爾類型,理論上只需要占1bit的空間就足夠了,但是大多數的編譯器在實際實現上都采用1字節,因為在現在的計算機內存性能下沒必要減少那7bit的空間
2.很明顯,flag的類型就是_Bool
3.這點就很重要了!上面也提及過,在C語言中,一直只用int類型作為條件表達式的值,條件是真則表達式值就是1,條件是假則表達式值就是0
4.驗證了上面的第3點,即便是_Bool類型的變量在做邏輯運算時,返回的結果還是int類型
所以,_Bool並沒有改變C的規則,對於所有的條件表達式仍然以1表示真,以0表示假,它的加入,只是使得讓編寫人員有一種更直觀的類型去保存那些期望是布爾值的變量。
您應該這樣使用_Bool類型:對_Bool類型的賦值應該用條件表達式的值或返回類型是_Bool類型的函數。
個人觀點,新的_Bool可以理解為只能保存0或1的unsigned char類型,。
(上文是本人對C99標准新類型_Bool的理解,錯誤或不嚴謹之處懇請指出。)