C語(yǔ)言中bool和float的用法實(shí)例解析
一、BOOL
1、C語(yǔ)言bool詳解
bool是C語(yǔ)言中的一個(gè)關(guān)鍵字,用于聲明布爾類型的變量。布爾類型只有兩個(gè)可能的值:true和false。- 在C99標(biāo)準(zhǔn)之前,C語(yǔ)言并沒有內(nèi)置的布爾類型,人們通常使用
int類型,并用0表示false,非0(通常是1)表示true。C99標(biāo)準(zhǔn)引入了bool類型,以及頭文件<stdbool.h>,它定義了bool、true和false。
2、bool的用法和定義
要使用bool類型,首先需要包含頭文件<stdbool.h>,然后,你可以像聲明其他類型的變量一樣聲明bool類型的變量:
#include <stdbool.h> bool isHappy = true; bool isSad = false;
3、bool的基本作用
bool類型的主要作用是提供一種更直觀、更易于理解的方式來(lái)表示邏輯值。在編寫條件語(yǔ)句時(shí),使用bool類型的變量可以使代碼更加清晰和易于理解。
4、bool與其他類型的轉(zhuǎn)換
在需要時(shí),bool類型的值可以隱式地轉(zhuǎn)換為int類型,其中false轉(zhuǎn)換為0,true轉(zhuǎn)換為1。但是,將int類型轉(zhuǎn)換為bool類型時(shí),0會(huì)被轉(zhuǎn)換為false,任何非0的值都會(huì)被轉(zhuǎn)換為true。
5、使用bool的注意事項(xiàng)
- 不要將
bool類型的變量與整數(shù)類型混淆,盡管它們之間可以轉(zhuǎn)換。 - 在編寫條件語(yǔ)句時(shí),直接使用
bool類型的變量作為條件,而不要與true或false進(jìn)行比較,例如if (isHappy)而不是if (isHappy == true)。 - 在一些舊的C編譯器或環(huán)境中,可能不支持
bool類型。在這種情況下,你可以使用int類型并遵循相同的邏輯約定。
6、拓展:bool類型與其“零值”比較
在布爾邏輯的語(yǔ)義中,零值被視為“假”(FALSE),而任何非零值都被視為“真”(TRUE)。值得注意的是,TRUE的具體數(shù)值并沒有統(tǒng)一的標(biāo)準(zhǔn),它依賴于具體的編程語(yǔ)言或環(huán)境。例如,在Visual C++中,TRUE被定義為1,而在Visual Basic中,TRUE則被定義為-1。
重要的是要理解,bool類型變量的本質(zhì)是一個(gè)布爾表達(dá)式,用于表示與“零值”(即FALSE)的比較結(jié)果。因此,在if語(yǔ)句中直接使用bool類型的變量作為條件表達(dá)式,無(wú)需顯式地與其“零值”進(jìn)行比較。正確的if語(yǔ)句用法如下:
bool b; // 假設(shè)b已被賦予某個(gè)值 if (b) { // 如果b為真(非零),則執(zhí)行此處代碼 ... } // 使用邏輯非操作符"!"來(lái)檢查b是否為假(零值) if (!b) { // 如果b為假(零值),則執(zhí)行此處代碼 ... }
二、FLOAT
1、float的定義和用途
float關(guān)鍵字用于聲明一個(gè)單精度浮點(diǎn)變量,它能夠存儲(chǔ)帶有小數(shù)的數(shù)值,且數(shù)值范圍相對(duì)較廣。在C語(yǔ)言中,float類型通常占用4個(gè)字節(jié)(32位)的內(nèi)存空間,其中1位用于符號(hào)位,8位用于指數(shù)位,而剩下的23位則用于尾數(shù)位。
2、float的基本使用
在C語(yǔ)言中,使用float關(guān)鍵字定義變量時(shí),需要在變量名后加上“f”或“F”后綴,以明確表示這是一個(gè)float類型的常量。例如:
float a = 3.14f; //如果不加“f”或“F”后綴,編譯器可能會(huì)將其視為double類型的常量,進(jìn)而可能引發(fā)類型不匹配的警告或錯(cuò)誤。
3、float的精度問題
float精度問題的根本原因在于計(jì)算機(jī)內(nèi)部使用二進(jìn)制來(lái)表示浮點(diǎn)數(shù),而很多十進(jìn)制小數(shù)無(wú)法完全用二進(jìn)制精確表示。此外,float類型在存儲(chǔ)時(shí)遵循IEEE 754標(biāo)準(zhǔn),該標(biāo)準(zhǔn)將32位分為符號(hào)位(1位)、指數(shù)位(8位)和尾數(shù)位(23位),這種表示方式也限制了float的精度。
具體來(lái)說,尾數(shù)位用于表示浮點(diǎn)數(shù)的小數(shù)部分,但由于只有23位,因此只能精確表示一定范圍內(nèi)的數(shù)字。對(duì)于超出這個(gè)范圍的數(shù)字,計(jì)算機(jī)將進(jìn)行舍入操作,以找到最接近的可表示數(shù)字,從而導(dǎo)致精度損失。
4、精度問題的舉例
1、0.1無(wú)法精確表示:
在十進(jìn)制中,0.1是一個(gè)簡(jiǎn)單的數(shù)字,但在二進(jìn)制中,它無(wú)法精確表示。當(dāng)我們嘗試將0.1存儲(chǔ)為float類型時(shí),計(jì)算機(jī)會(huì)將其轉(zhuǎn)換為最接近的二進(jìn)制分?jǐn)?shù),從而導(dǎo)致精度損失。例如:
float a = 0.1f; // 輸出可能不是0.1,而是類似0.100000024的近似值
2、浮點(diǎn)數(shù)相加產(chǎn)生精度損失:
當(dāng)我們將兩個(gè)浮點(diǎn)數(shù)相加時(shí),如果它們的小數(shù)部分無(wú)法精確表示,那么相加的結(jié)果也可能出現(xiàn)精度損失。例如:
float b = 0.2f; float c = a + b; // a為上面例子中定義的0.1f // c可能不是0.3,而是類似0.300000012的近似值
3、浮點(diǎn)數(shù)相加產(chǎn)生精度損失:
在進(jìn)行循環(huán)或條件判斷時(shí),如果涉及到浮點(diǎn)數(shù)的比較,可能會(huì)因?yàn)榫葐栴}而導(dǎo)致邏輯錯(cuò)誤。例如,在判斷兩個(gè)浮點(diǎn)數(shù)是否相等時(shí),由于精度損失,直接使用==運(yùn)算符往往不是最佳選擇。
5、拓展:float類型與“零值”比較
float?類型對(duì)應(yīng)的“零值”并不是0.0?,這是由于浮點(diǎn)類型會(huì)丟失精度。此外,float?類型不能用==?或者!=?進(jìn)行比較,只能使用<=?和>=?構(gòu)建一個(gè)排除其“零值”的區(qū)間進(jìn)行比較。
如僅分析理論,在c語(yǔ)言的float.h?或c++的cfloat?文件中,提供了一個(gè)FLT_EPSILON?常量。該常量為1.192092896e-07F?,表示1與大于的第一個(gè)(或最?。﹩尉雀↑c(diǎn)數(shù)之差,即理論最小正單精度浮點(diǎn)數(shù)。根據(jù)該常量,我們可以寫出以下語(yǔ)句:
#include<float.h>
// c++ 為 #include<cfloat>
...
float a = 某浮點(diǎn)數(shù);
...
// 為"零值"
if((a >= -FLT_EPSILON) && (a <= FLT_EPSILON)){
...
}
// ---- and ----
// 不為“零值”
if((a <= -FLT_EPSILON) || (a >= FLT_EPSILON)){
...
}
此外,double類型也有同樣的極限常量,為DBL_EPSILON?,同樣可從float.h?或cfloat?文件引入,在此不做贅述。
實(shí)際過程中,需要具體情況具體分析,還要考慮讀數(shù)的測(cè)量誤差等問題,而非簡(jiǎn)單用數(shù)學(xué)極限去排除“零值”。比如一個(gè)表示測(cè)量水桶水位的浮點(diǎn)讀數(shù),假設(shè)當(dāng)水桶水空的時(shí)候,再往里面加水,此時(shí)我們?nèi)绻肍LT_EPSILON?去比較就不太合理了。
6、拓展:指針變量與其“零值”比較
指針變量的零值是“空”(記為NULL?),在C語(yǔ)言和C++中,NULL?的定義并不相同。
//在C語(yǔ)言中,習(xí)慣將NULL定義為void*指針值0: #define NULL (void*)0 //在C++中,NULL卻被明確定義為整常數(shù)0: // wchar.h中定義NULL的源碼 #ifndef NULL #ifdef __cplusplus #ifndef _WIN64 #define NULL 0 #else #define NULL 0LL #endif /* W64 */ #else #define NULL ((void *)0) #endif #endif
在C++11以下的版本中,指針變量與其“零值”的比較,實(shí)質(zhì)上就是指針變量與NULL?的比較,而在C++11以上的版本中,由于nullptr的引入,統(tǒng)一了C語(yǔ)言和C++的差異,如下:
//----------------C++ 11 以下--------------------
char* c;
if(c == NULL){
...
}
// ---- and ----
if(c != NULL){
...
}
//----------------C++ 11 以上--------------------
char* c;
if(c == nullptr){
...
}
// ---- and ----
if(c != nullptr){
...
}
總結(jié)
到此這篇關(guān)于C語(yǔ)言中bool和float的用法的文章就介紹到這了,更多相關(guān)C語(yǔ)言 bool和float解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Qt封裝一個(gè)發(fā)送http請(qǐng)求通用類
這篇文章主要為大家詳細(xì)介紹了如何使用Qt封裝一個(gè)通用類,可以通過QNetworkRequest和QNetworkReply進(jìn)行http請(qǐng)求,感興趣的可以了解一下2024-12-12
簡(jiǎn)述C語(yǔ)言中system()函數(shù)與vfork()函數(shù)的使用方法
這篇文章主要介紹了簡(jiǎn)述C語(yǔ)言中system()函數(shù)與vfork()函數(shù)的使用方法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08
如何用C寫一個(gè)web服務(wù)器之I/O多路復(fù)用
本文主要介紹了如何用C寫一個(gè)web服務(wù)器之I/O多路復(fù)用,本次選擇了 I/O 模型的優(yōu)化,因?yàn)樗欠?wù)器的基礎(chǔ),這個(gè)先完成的話,后面的優(yōu)化就可以選擇各個(gè)模塊來(lái)進(jìn)行,不必進(jìn)行全局化的改動(dòng)了。2021-05-05
淺析成員函數(shù)和常成員函數(shù)的調(diào)用
下面小編就為大家?guī)?lái)一篇淺析成員函數(shù)和常成員函數(shù)的調(diào)用。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來(lái)看看吧2016-05-05
C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實(shí)現(xiàn)
了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實(shí)現(xiàn)搜索二叉樹,需要的可以參考一下2022-05-05
C++ 非遞歸實(shí)現(xiàn)二叉樹的前中后序遍歷
本文將結(jié)合動(dòng)畫和代碼演示如何通過C++ 非遞歸實(shí)現(xiàn)二叉樹的前中后序的遍歷,代碼具有一定的價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下2021-11-11

