對C99新增的 Bool型別的理解

2022-07-01 21:21:08 字數 1387 閱讀 2759

傳統(指c90)c標準中是沒有布林型別的,對於c來說,非0即是真,而0即是假,這裡0不僅包括整型家族的0,還包括浮點家族的0.0,有如下**,

1

if (0.0

)else

輸出的結果是: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 2 #include 3

4int

main()

輸出結果:

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的理解,錯誤或不嚴謹之處懇請指出。)

C99標準之前沒有bool型別(C99提供)

我們知道在c 裡有專門的bool型別,用來表示真或假。但是在c語言裡沒有這樣的型別。表示式的值0為假,非0為真。所以條件判斷語句 if while 非常靈活,甚至乙個指標型別都可以是條件表示式。為了使程式更清晰,我們常常會給出如下的巨集定義 typedef int bool define true ...

C99新增的柔性陣列

我總結了一下用指標和用變長結構體的區別 1.在位置方面 指標可以放在任何地方,但是變長結構體的變長部分一定要放在結構體的最後。2.在記憶體占用方面 指標會佔乙個指標的大小的記憶體空間,但是變長陣列是不佔記憶體的,它只是乙個佔位符。3.在記憶體布局方面 指標指向的記憶體和結構體的記憶體可以是不連續的,...

c99的新功能

參考 在ansi的標準確立後,c語言的規範在一段時間內沒有大的變動,然而c 在自己的標準化建立過程中繼續發展壯大。標準修正案一 在1994年為c語言建立了乙個新標準,但是只修正了一些c89標準中的細節和增加更多更廣的國際字符集支援。不過,這個標準引出了1999年iso 9899 1999的發表。它通...