C語(yǔ)言中bool變量的深入理解
前言
在一些高級(jí)語(yǔ)言當(dāng)中,為了能夠完成更好的邏輯判斷,因此就有了bool類型,bool類型的變量值只有true和false兩種。
而在C語(yǔ)言中,一般認(rèn)為0為假,非0為真。
這是因?yàn)閏99之前,c90是沒(méi)有bool類型的的。但是c99引入了_Bool類型(_Bool就是一個(gè)類型,不過(guò)在新增頭文件stdbool.h中,被重新用宏寫(xiě)成了 bool,為了保證C/C++兼容性)。
目前為止大部分C語(yǔ)言書(shū)籍采用的標(biāo)準(zhǔn)還是c90標(biāo)準(zhǔn),因此我們很少用bool類型。
bool類型變量的大小

可以看到,這里的bool類型的大小和我們平時(shí)的真或假的大小是不一樣的。
下面是bool類型的源碼:

可見(jiàn),stdbool.h中定義了4個(gè)宏,bool、true、false、__bool_true_false_are_defined。 其中bool就是 _Bool類型,true和false的值為1和0,__bool_true_false_are_defined的值為1。
注意這里的bool類型和char類型雖然都是1字節(jié),但是它們是不同的:char 中存儲(chǔ)字符,全局變量初始值為'\0',bool 中存0或1,全局變量默認(rèn)初始化為0。
C語(yǔ)言中的邏輯表達(dá)式的返回結(jié)果,比如 a==b的返回結(jié)果,只有0和1兩種可能,但是它們的大小確是4,也就是用整形表示真假:

另外,在VS2013中,微軟還給我們?cè)O(shè)計(jì)了大寫(xiě)的BOOL類型,這個(gè)類型在VS2019中就被刪除了,BOOL類型將int進(jìn)行了重命名,因此它的大小是4個(gè)字節(jié)。不推薦這種類型,因?yàn)檫@是微軟的標(biāo)準(zhǔn),如果換到其他編譯環(huán)境則無(wú)法使用。
bool 值與0比較
對(duì)于if條件的表達(dá)式,一般有以下三種寫(xiě)法:
#include <stdio.h>
int main()
{
int pass = 0; //0表示假,C90,我們習(xí)慣用int表示bool
if (pass == 0)
{
//理論上可行,但此時(shí)的pass是應(yīng)該被當(dāng)做bool看待的,
//這里與整形數(shù)字0比較,這種表示方法在語(yǔ)義上并不直觀,不推薦
}
if (pass == false)
{
//不推薦,因?yàn)橹荒茉贑99中使用
}
if (pass)
{
//推薦
}
return 0;
}
之所以推薦使用第三種,因?yàn)閕f語(yǔ)句在開(kāi)始使用時(shí)先要進(jìn)行條件判定,而判定的正是括號(hào)()中表達(dá)式或函數(shù)的邏輯結(jié)果,這個(gè)邏輯結(jié)果只有真或假。
在這里pass并沒(méi)有進(jìn)行任何條件判定,所以pass本身就是邏輯結(jié)果,這樣就能反應(yīng)出來(lái)flag是真或者假,這里pass的值是0表示假,如果想要其表示真只需要加邏輯反!即可:!pass
如果要采用bool類型:
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool pass = false; //C99
if (pass != 1)
{
//與整形數(shù)字0比較,這種表示方法在語(yǔ)義上并不直觀,不推薦
//另外,非0為真,但是非0有多個(gè),這里也不一定是完全正確的
}
if (pass != true)
{
//不推薦,這樣寫(xiě)雖然沒(méi)有問(wèn)題,但是并不直觀
}
if (!pass)
{
//推薦,pass本身表示假,取反表示真
}
return 0;
}
結(jié)論:bool類型,直接判定,不用操作符進(jìn)行和特定值的比較。
c語(yǔ)言中bool如何輸出
c中的bool型就是0和1,因此可以用%d輸出,因此。。。代碼如下:
#include <stdio.h>
void main()
{
bool b = true;
printf("%d\n",b);
bool c = false;
printf("%d\n",c);
}
總結(jié)
到此這篇關(guān)于C語(yǔ)言中bool變量的文章就介紹到這了,更多相關(guān)C語(yǔ)言bool變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)
下面小編就為大家?guī)?lái)一篇探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2017-01-01
C語(yǔ)言內(nèi)存函數(shù) memcpy,memmove ,memcmp
這篇文章主要介紹了C語(yǔ)言內(nèi)存函數(shù) memcpy,memmove ,memcmp,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
C++右值引用與move和forward函數(shù)的使用詳解
為了支持移動(dòng)操作,新標(biāo)準(zhǔn)引入了一種新的引用類型——右值引用(rvalue reference)。所謂右值引用就是必須綁定到右值的引用,這篇文章主要介紹了C++右值引用與move和forward的使用2022-08-08
利用C語(yǔ)言實(shí)現(xiàn)http服務(wù)器(Linux)
本文將利用C語(yǔ)言實(shí)現(xiàn)一個(gè)輕量級(jí)的http服務(wù)器,使用Reactor模式,即主線程只負(fù)責(zé)監(jiān)聽(tīng)文件描述符上是否有事件發(fā)生,有的話立即將該事件通知工作線程,感興趣的可以了解一下2022-07-07
仿現(xiàn)代C++智能指針實(shí)現(xiàn)引用計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了如何仿現(xiàn)代C++智能指針實(shí)現(xiàn)引用計(jì)數(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下2024-03-03
C++進(jìn)程間共享數(shù)據(jù)實(shí)例
這篇文章主要介紹了C++進(jìn)程間共享數(shù)據(jù)的方法,是進(jìn)行C++應(yīng)用程序開(kāi)發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10
C++ 中使用不同平臺(tái)的時(shí)間函數(shù)及對(duì)比分析
在C++ 編程中,時(shí)間函數(shù)的選擇對(duì)于性能測(cè)量、任務(wù)調(diào)度和時(shí)間戳記錄至關(guān)重要,本文將介紹在 C++ 中常用的時(shí)間函數(shù),并比較它們?cè)诓煌脚_(tái)上的應(yīng)用和效果,感興趣的朋友跟隨小編一起看看吧2024-06-06

