国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

淺談C語言編程中的布爾bool數據類型

2020-05-23 14:13:40
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C語言編程中的布爾bool數據類型,bool并不是需要通過C++才能使用的,需要的朋友可以參考下

我們知道在C++里有專門的bool類型,用來表示真或假。但是在C語言里沒有這樣的類型(至少我是一直這么認為的),表達式的值0為假,非0為真。所以條件判斷語句( if(…)、while(…) )非常靈活,甚至一個指針類型都可以是條件表達式。

為了使程序更清晰,我們常常會給出如下的宏定義:

 

 
  1. typedef int BOOL; 
  2. #define TRUE 1 
  3. #define FALSE 0 

這是最常見的寫法,能被任何C語言編譯器認可。

今天我在一段程序里看見這么一行 #include ,這個陌生的頭文件還以std打頭而且還和bool有關,引起了我的警覺,立刻百度之。得知這是C99標準新增的頭文件,意在引入bool類型,使之和C++兼容。隨后我看了一下這個頭文件的源代碼,內容如下:

 

 
  1. /* 
  2. * ISO C Standard: 7.16 Boolean type and values 
  3. */ 
  4. #ifndef _STDBOOL_H 
  5. #define _STDBOOL_H 
  6. #ifndef __cplusplus 
  7. #define bool _Bool 
  8. #define true 1 
  9. #define false 0 
  10. #else /* __cplusplus */ 
  11. /* Supporting in C++ is a GCC extension. */ 
  12. #define _Bool bool 
  13. #define bool bool 
  14. #define false false 
  15. #define true true 
  16. #endif /* __cplusplus */ 
  17. /* Signal that all the definitions are present. */ 
  18. #define __bool_true_false_are_defined 1 
  19. #endif /* stdbool.h */ 

這個頭文件很短,而且也很明了,不過我對_Bool這個類型產生的興趣。又一翻百度,發現這是C99標準引入的新的關鍵字。對,是關鍵字,而不是宏定義,也不是typedef。通過sizeof(_Bool);得知這個類型占1個字節,而且無論給這個類型的變量賦任何非0整數值,其值都是1,這也說明了他不是其他整數類型的別名。

好了,其實說白了,C語言不是沒有布爾類型,只能說在C99標準之前沒有。現在只要在源文件中包含stdbool.h這個頭文件,就可以在C語言里像C++那樣使用bool類型了。

所以如果是C99之前的標準,需要我們自己定義bool,如

 

 
  1. typedef enum {false = 0, true = 1} bool; 

那么我們就來看一下C語言中的相關定義:

1.FALSE/TRUE與false/true的區別:

false/true是標準C++語言里新增的關鍵字,而FALSE/TRUE是通過#define,這要用途

是解決程序在C與C++中環境的差異,以下是FALSE/TRUE在windef.h的定義:

 

  1. #ifndef FALSE  
  2. #define FALSE 0  
  3. #endif  
  4. #ifndef TRUE  
  5. #define TRUE 1  
  6. #endif  

也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過

我們在使用中沒有這種感覺,因為C++會幫你做隱式轉換。

2.bool的大小與BOOL的區別:

bool在C++里是占用1字節,而BOOL是int類型,int類型的大小是視具體環境而定的;所以

來說:false/true只占用1個字節,而TRUE/FALSE視具體環境而言,以下是BOOL在windef

.h中的定義:typedef int BOOL;

3.NULL與0的區別:

還是讓我們看一下windef.h中NULL的定義:

 

 
  1. #ifndef NULL  
  2. #ifdef __cplusplus//這個是指示是用C++來編譯程序  
  3. #define NULL 0  
  4. #else  
  5. #define NULL ((void *)0)  
  6. #endif  
  7. #endif  

所以說:它們沒有區別,只不過在C里面會做一個強制類型轉換。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡嘎县| 常德市| 顺平县| 青海省| 荆州市| 定陶县| 新泰市| 泉州市| 门源| 鹤峰县| 贡嘎县| 得荣县| 尼勒克县| 寻乌县| 秦安县| 临潭县| 随州市| 舟山市| 南丰县| 南华县| 南昌市| 南投市| 清远市| 潼关县| 新干县| 沾化县| 于田县| 尚义县| 沙湾县| 山西省| 绥化市| 剑河县| 浮山县| 额济纳旗| 古蔺县| 上杭县| 西峡县| 承德县| 桐柏县| 濉溪县| 洮南市|