天天看點

《編寫高品質代碼:改善c程式代碼的125個建議》——建議17-2:避免“懸挂”的else

本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第3章,建議17-2,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

對于“懸挂”的else這個問題,或許大家都已經了解甚至熟知了。盡管如此,但在平時編碼中還是會有許多菜鳥和老手在此為程式埋下bug的種子,如下面的示例代碼所示:

上面的代碼雖然看起來比較簡潔,但卻給程式帶來緻命性錯誤,同時這種寫作方式也是許多老手所崇拜的(if語句後省略掉花括号{})。

在上面的這段代碼中,我們的本意應該有兩種主要情況:a>b與a<=b。如果滿足條件a>b,我們将繼續判斷條件b然而實際情況并非如此,這段代碼所做的與我們的意圖相去甚遠。其根本原因就在于c語言中有這樣一條規則:else始終與同一對括号内最近的未比對的if相結合。根據這條規則,代碼中的else應該與if(bb) 進行配對,是以變量x的原值沒有變,依然還是0。

為了使大家能夠更加清楚地看到“懸挂”的else所産生的原因以及帶來的問題,我們可以通過給if/else語句加上“{}”,寫成如下等價形式:

現在,大家就能夠很清楚地看到這個else 到底與誰比對了。由此可以看出,不論是菜鳥還是老手,在什麼時候都不能夠偷懶,還是老老實實地把“{}”加上,這樣就不會讓我們迷糊了。正确的寫法如下面的代碼所示:

現在,代碼中的else可以正确地與第一個if(a>b) 相結合了,即使它離第二個if(b除此之外,有些c程式員也通過使用宏定義的方式來能達到類似的效果,如下面的示例代碼所示:

雖然這樣也可以避免“懸挂”的else這個問題,但是這樣的代碼卻很難讀懂,尤其會給後來的代碼維護人員帶來麻煩,是以我們不建議大家這樣做。

繼續閱讀