C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)
1、bool 變量與“零值”進(jìn)行比較
bool 變量與“零值”進(jìn)行比較的 if 語(yǔ)句怎么寫(xiě)?
bool bTestFlag = FALSE;//想想為什么一般初始化為 FALSE 比較好?
A), if(bTestFlag == 0); if(bTestFlag == 1);
B), if(bTestFlag == TRUE); if(bTestFlag == FLASE);
C), if(bTestFlag); if(!bTestFlag);
哪一組或是那些組正確呢?我們來(lái)分析分析:
A)寫(xiě)法: bTestFlag 是什么?整型變量?如果要不是這個(gè)名字遵照了前面的命名規(guī)范,
肯怕很容易讓人誤會(huì)成整型變量。所以這種寫(xiě)法不好。
B)寫(xiě)法: FLASE 的值大家都知道,在編譯器里被定義為 0;但 TRUE 的值呢?都是 1
嗎?很不幸,不都是 1。 Visual C++定義為 1,而它的同胞兄弟 Visual Basic 就把 TRUE 定義
為-1.那很顯然,這種寫(xiě)法也不好。
大家都知道 if 語(yǔ)句是靠其后面的括號(hào)里的表達(dá)式的值來(lái)進(jìn)行分支跳轉(zhuǎn)的。表達(dá)式如果
為真,則執(zhí)行 if 語(yǔ)句后面緊跟的代碼;否則不執(zhí)行。那顯然,本組的寫(xiě)法很好,既不會(huì)引
起誤會(huì),也不會(huì)由于 TRUE 或 FLASE 的不同定義值而出錯(cuò)。記住:以后寫(xiě)代碼就得這樣寫(xiě)。
2、float 變量與“零值”進(jìn)行比較
float 變量與“零值”進(jìn)行比較的 if 語(yǔ)句怎么寫(xiě)?
float fTestVal = 0.0;
A), if(fTestVal == 0.0); if(fTestVal != 0.0);
B), if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 為定義好的
精度。
哪一組或是那些組正確呢?我們來(lái)分析分析:
float 和 double 類(lèi)型的數(shù)據(jù)都是有精度限制的,這樣直接拿來(lái)與 0.0 比,能正確嗎?明顯
不能,看例子: 的值四舍五入精確到小數(shù)點(diǎn)后 ? 10 位為: 3.1415926536,你拿它減去
0.00000000001 然后再四舍五入得到的結(jié)果是多少?你能說(shuō)前后兩個(gè)值一樣嗎?
EPSINON 為定義好的精度,如果一個(gè)數(shù)落在[0.0-EPSINON,0.0+EPSINON] 這個(gè)閉區(qū)間
內(nèi),我們認(rèn)為在某個(gè)精度內(nèi)它的值與零值相等;否則不相等。擴(kuò)展一下,把 0.0 替換為你想
比較的任何一個(gè)浮點(diǎn)數(shù),那我們就可以比較任意兩個(gè)浮點(diǎn)數(shù)的大小了,當(dāng)然是在某個(gè)精度
內(nèi)。
同樣的也不要在很大的浮點(diǎn)數(shù)和很小的浮點(diǎn)數(shù)之間進(jìn)行運(yùn)算,比如:
10000000000.00 + 0.00000000001
這樣計(jì)算后的結(jié)果可能會(huì)讓你大吃一驚。
3、指針變量與“零值”進(jìn)行比較
指針變量與“零值”進(jìn)行比較的 if 語(yǔ)句怎么寫(xiě)?
int * p = NULL;//定義指針一定要同時(shí)初始化,指針與數(shù)組那章會(huì)詳細(xì)講解。
A), if(p == 0); if(p != 0);
B), if(p); if(!p);
C) , if(NULL == p); if(NULL != p);
哪一組或是那些組正確呢?我們來(lái)分析分析:
A)寫(xiě)法: p 是整型變量?容易引起誤會(huì),不好。盡管 NULL 的值和 0 一樣,但意義不同。
B)寫(xiě)法: p 是 bool 型變量?容易引起誤會(huì),不好。
C)寫(xiě)法:這個(gè)寫(xiě)法才是正確的,但樣子比較古怪。為什么要這么寫(xiě)呢?是怕漏寫(xiě)一個(gè)
“ =”號(hào):if(p = NULL),這個(gè)表達(dá)式編譯器當(dāng)然會(huì)認(rèn)為是正確的,但卻不是你要表達(dá)的意思。
所以,非常推薦這種寫(xiě)法。
?
else 到底與哪個(gè) if 配對(duì)呢?
else 常常與 if 語(yǔ)句配對(duì),但要注意書(shū)寫(xiě)規(guī)范,看下面例子:
if( 0 == x)
if( 0 == y) error();
else{
//program code
}
這個(gè) else 到底與誰(shuí)匹配呢?讓人迷糊,尤其是初學(xué)者。還好, C 語(yǔ)言有這樣的規(guī)定: else
始終與同一括號(hào)內(nèi)最近的未匹配的 if 語(yǔ)句結(jié)合。
?
if 語(yǔ)句后面的分號(hào)
關(guān)于 if-else 語(yǔ)句還有一個(gè)容易出錯(cuò)的地方就是與空語(yǔ)句的連用。看下面的例子:
if(NULL != p) ;
fun();
這里的 fun()函數(shù)并不是在 NULL != p 的時(shí)候被調(diào)用,而是任何時(shí)候都會(huì)被調(diào)用。問(wèn)題就出
在 if 語(yǔ)句后面的分號(hào)上。在 C 語(yǔ)言中,分號(hào)預(yù)示著一條語(yǔ)句的結(jié)尾,但是并不是每條 C 語(yǔ)
言語(yǔ)句都需要分號(hào)作為結(jié)束標(biāo)志。if 語(yǔ)句的后面并不需要分號(hào), 但如果你不小心寫(xiě)了個(gè)分號(hào),
編譯器并不會(huì)提示出錯(cuò)。因?yàn)榫幾g器會(huì)把這個(gè)分號(hào)解析成一條空語(yǔ)句。也就是上面的代碼實(shí)
際等效于:
if(NULL != p)
{
;
}
fun();
這是初學(xué)者很容易犯的錯(cuò)誤,往往不小心多寫(xiě)了個(gè)分號(hào),導(dǎo)致結(jié)果與預(yù)想的相差很遠(yuǎn)。所
以建議在真正需要用空語(yǔ)句時(shí)寫(xiě)成這樣:
NULL;
而不是單用一個(gè)分號(hào)。這就好比匯編語(yǔ)言里面的空指令,比如 ARM 指令中的 NOP 指令。
這樣做可以明顯的區(qū)分真正必須的空語(yǔ)句和不小心多寫(xiě)的分號(hào)。
使用 if 語(yǔ)句的其他注意事項(xiàng)
【規(guī)則 1-17】先處理正常情況,再處理異常情況。
在編寫(xiě)代碼是,要使得正常情況的執(zhí)行代碼清晰,確認(rèn)那些不常發(fā)生的異常情況處理
代碼不會(huì)遮掩正常的執(zhí)行路徑。這樣對(duì)于代碼的可讀性和性能都很重要。因?yàn)?#xff0c; if 語(yǔ)句總是
需要做判斷,而正常情況一般比異常情況發(fā)生的概率更大(否則就應(yīng)該把異常正常調(diào)過(guò)來(lái)
了),如果把執(zhí)行概率更大的代碼放到后面,也就意味著 if 語(yǔ)句將進(jìn)行多次無(wú)謂的比較。另
外,非常重要的一點(diǎn)是,把正常情況的處理放在 if 后面,而不要放在 else 后面。當(dāng)然這也
符合把正常情況的處理放在前面的要求。
【規(guī)則 1-18】確保 if 和 else 子句沒(méi)有弄反。
這一點(diǎn)初學(xué)者也容易弄錯(cuò),往往把本應(yīng)該放在 if 語(yǔ)句后面的代碼和本應(yīng)該放在 else 語(yǔ)
句后面的代碼弄反了。
總結(jié)
以上是生活随笔為你收集整理的C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机原理与基础 —— (皇帝身边的小太
- 下一篇: 写文件 —— 将内容按照指定格式写入配置