淺談C語言編程中的布爾bool數(shù)據(jù)類型
我們知道在C++里有專門的bool類型,用來表示真或假。但是在C語言里沒有這樣的類型(至少我是一直這么認(rèn)為的),表達(dá)式的值0為假,非0為真。所以條件判斷語句( if(…)、while(…) )非常靈活,甚至一個(gè)指針類型都可以是條件表達(dá)式。
為了使程序更清晰,我們常常會(huì)給出如下的宏定義:
typedef int BOOL; #define TRUE 1 #define FALSE 0
這是最常見的寫法,能被任何C語言編譯器認(rèn)可。
今天我在一段程序里看見這么一行 #include ,這個(gè)陌生的頭文件還以std打頭而且還和bool有關(guān),引起了我的警覺,立刻百度之。得知這是C99標(biāo)準(zhǔn)新增的頭文件,意在引入bool類型,使之和C++兼容。隨后我看了一下這個(gè)頭文件的源代碼,內(nèi)容如下:
/* * ISO C Standard: 7.16 Boolean type and values */ #ifndef _STDBOOL_H #define _STDBOOL_H #ifndef __cplusplus #define bool _Bool #define true 1 #define false 0 #else /* __cplusplus */ /* Supporting in C++ is a GCC extension. */ #define _Bool bool #define bool bool #define false false #define true true #endif /* __cplusplus */ /* Signal that all the definitions are present. */ #define __bool_true_false_are_defined 1 #endif /* stdbool.h */
這個(gè)頭文件很短,而且也很明了,不過我對_Bool這個(gè)類型產(chǎn)生的興趣。又一翻百度,發(fā)現(xiàn)這是C99標(biāo)準(zhǔn)引入的新的關(guān)鍵字。對,是關(guān)鍵字,而不是宏定義,也不是typedef。通過sizeof(_Bool);得知這個(gè)類型占1個(gè)字節(jié),而且無論給這個(gè)類型的變量賦任何非0整數(shù)值,其值都是1,這也說明了他不是其他整數(shù)類型的別名。
好了,其實(shí)說白了,C語言不是沒有布爾類型,只能說在C99標(biāo)準(zhǔn)之前沒有?,F(xiàn)在只要在源文件中包含stdbool.h這個(gè)頭文件,就可以在C語言里像C++那樣使用bool類型了。
所以如果是C99之前的標(biāo)準(zhǔn),需要我們自己定義bool,如
typedef enum {false = 0, true = 1} bool;
那么我們就來看一下C語言中的相關(guān)定義:
1.FALSE/TRUE與false/true的區(qū)別:
false/true是標(biāo)準(zhǔn)C++語言里新增的關(guān)鍵字,而FALSE/TRUE是通過#define,這要用途
是解決程序在C與C++中環(huán)境的差異,以下是FALSE/TRUE在windef.h的定義:
#ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif
也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過
我們在使用中沒有這種感覺,因?yàn)镃++會(huì)幫你做隱式轉(zhuǎn)換。
2.bool的大小與BOOL的區(qū)別:
bool在C++里是占用1字節(jié),而BOOL是int類型,int類型的大小是視具體環(huán)境而定的;所以
來說:false/true只占用1個(gè)字節(jié),而TRUE/FALSE視具體環(huán)境而言,以下是BOOL在windef
.h中的定義:typedef int BOOL;
3.NULL與0的區(qū)別:
還是讓我們看一下windef.h中NULL的定義:
#ifndef NULL #ifdef __cplusplus//這個(gè)是指示是用C++來編譯程序 #define NULL 0 #else #define NULL ((void *)0) #endif #endif
所以說:它們沒有區(qū)別,只不過在C里面會(huì)做一個(gè)強(qiáng)制類型轉(zhuǎn)換。
相關(guān)文章
C++實(shí)現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C++實(shí)現(xiàn)LeetCode(57.插入?yún)^(qū)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(57.插入?yún)^(qū)間),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

