1. 程式人生 > >C 判斷 —— if...else 語句(bool變數、float變數、指標變數與“零值”進行比較)(else 到底與哪個 if 配對呢? if 語句後面的分號?)

C 判斷 —— if...else 語句(bool變數、float變數、指標變數與“零值”進行比較)(else 到底與哪個 if 配對呢? if 語句後面的分號?)

1、bool 變數與“零值”進行比較

bool 變數與“零值”進行比較的 if 語句怎麼寫?

bool bTestFlag = FALSE;//想想為什麼一般初始化為 FALSE 比較好?
A), if(bTestFlag == 0); if(bTestFlag == 1);
B), if(bTestFlag == TRUE); if(bTestFlag == FLASE);
C), if(bTestFlag); if(!bTestFlag);
哪一組或是那些組正確呢?我們來分析分析:
A)寫法: bTestFlag 是什麼?整型變數?如果要不是這個名字遵照了前面的命名規範,
肯怕很容易讓人誤會成整型變數。所以這種寫法不好。
B)寫法: FLASE 的值大家都知道,在編譯器裡被定義為 0;但 TRUE 的值呢?都是 1
嗎?很不幸,不都是 1。 Visual C++定義為 1,而它的同胞兄弟 Visual Basic 就把 TRUE 定義
為-1.那很顯然,這種寫法也不好。
大家都知道 if 語句是靠其後面的括號裡的表示式的值來進行分支跳轉的。表示式如果
為真,則執行 if 語句後面緊跟的程式碼;否則不執行。那顯然,本組的寫法很好,既不會引
起誤會,也不會由於 TRUE 或 FLASE 的不同定義值而出錯。記住:以後寫程式碼就得這樣寫。

2、float 變數與“零值”進行比較

float 變數與“零值”進行比較的 if 語句怎麼寫?
float fTestVal = 0.0;
A), if(fTestVal == 0.0); if(fTestVal != 0.0);
B), if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 為定義好的
精度。
哪一組或是那些組正確呢?我們來分析分析:
float 和 double 型別的資料都是有精度限制的,這樣直接拿來與 0.0 比,能正確嗎?明顯
不能,看例子: 的值四捨五入精確到小數點後  10 位為: 3.1415926536,你拿它減去
0.00000000001 然後再四捨五入得到的結果是多少?你能說前後兩個值一樣嗎?
EPSINON 為定義好的精度,如果一個數落在[0.0-EPSINON,0.0+EPSINON] 這個閉區間
內,我們認為在某個精度內它的值與零值相等;否則不相等。擴充套件一下,把 0.0 替換為你想
比較的任何一個浮點數,那我們就可以比較任意兩個浮點數的大小了,當然是在某個精度
內。
同樣的也不要在很大的浮點數和很小的浮點數之間進行運算,比如:
10000000000.00 + 0.00000000001
這樣計算後的結果可能會讓你大吃一驚。

3、指標變數與“零值”進行比較

指標變數與“零值”進行比較的 if 語句怎麼寫?
int * p = NULL;//定義指標一定要同時初始化,指標與陣列那章會詳細講解。
A), if(p == 0); if(p != 0);
B), if(p); if(!p);
C) , if(NULL == p); if(NULL != p);
哪一組或是那些組正確呢?我們來分析分析:
A)寫法: p 是整型變數?容易引起誤會,不好。儘管 NULL 的值和 0 一樣,但意義不同。
B)寫法: p 是 bool 型變數?容易引起誤會,不好。
C)寫法:這個寫法才是正確的,但樣子比較古怪。為什麼要這麼寫呢?是怕漏寫一個
“ =”號:if(p = NULL),這個表示式編譯器當然會認為是正確的,但卻不是你要表達的意思。
所以,非常推薦這種寫法。
 

else 到底與哪個 if 配對呢?

else 常常與 if 語句配對,但要注意書寫規範,看下面例子:
if( 0 == x)
if( 0 == y) error();
else{
//program code
}
這個 else 到底與誰匹配呢?讓人迷糊,尤其是初學者。還好, C 語言有這樣的規定: else
始終與同一括號內最近的未匹配的 if 語句結合。

 

if 語句後面的分號

關於 if-else 語句還有一個容易出錯的地方就是與空語句的連用。看下面的例子:
if(NULL != p) ;
fun();
這裡的 fun()函式並不是在 NULL != p 的時候被呼叫,而是任何時候都會被呼叫。問題就出
在 if 語句後面的分號上。在 C 語言中,分號預示著一條語句的結尾,但是並不是每條 C 語
言語句都需要分號作為結束標誌。if 語句的後面並不需要分號, 但如果你不小心寫了個分號,
編譯器並不會提示出錯。因為編譯器會把這個分號解析成一條空語句。也就是上面的程式碼實
際等效於:
if(NULL != p)
{
;
}
fun();
這是初學者很容易犯的錯誤,往往不小心多寫了個分號,導致結果與預想的相差很遠。所
以建議在真正需要用空語句時寫成這樣:
NULL;
而不是單用一個分號。這就好比組合語言裡面的空指令,比如 ARM 指令中的 NOP 指令。
這樣做可以明顯的區分真正必須的空語句和不小心多寫的分號。

使用 if 語句的其他注意事項

【規則 1-17】先處理正常情況,再處理異常情況。
在編寫程式碼是,要使得正常情況的執行程式碼清晰,確認那些不常發生的異常情況處理
程式碼不會遮掩正常的執行路徑。這樣對於程式碼的可讀性和效能都很重要。因為, if 語句總是
需要做判斷,而正常情況一般比異常情況發生的概率更大(否則就應該把異常正常調過來
了),如果把執行概率更大的程式碼放到後面,也就意味著 if 語句將進行多次無謂的比較。另
外,非常重要的一點是,把正常情況的處理放在 if 後面,而不要放在 else 後面。當然這也
符合把正常情況的處理放在前面的要求。
【規則 1-18】確保 if 和 else 子句沒有弄反。
這一點初學者也容易弄錯,往往把本應該放在 if 語句後面的程式碼和本應該放在 else 語
句後面的程式碼弄反了。