天天看點

《編寫高品質代碼:改善c程式代碼的125個建議》——建議22:謹慎使用do/while與while循環

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

前面已經說過,在c語言中,循環控制語句除for循環語句之外,還提供另外兩種循環控制語句:while循環語句和do/while循環語句。在實際應用中,for 循環語句的使用頻率最高,while循環語句其次,do/while循環語句很少用。

建議22-1:無限循環優先選用for( ; ; ),而不是while(1)

在c語言中,最常用的無限循環語句主要有兩種:while (1) 和for( ; ; )。從功能上講,這兩種語句的效果完全一樣。那麼,我們究竟該選擇哪一種呢?

其實,從while和for的語義上來看,顯然for( ; ; ) 語句運作速度要快一些。按照for的文法規則,兩個分号“;”分開的是3個表達式。現在表達式為空,很自然地被編譯成無條件的跳轉(即無條件循環,不用判斷條件)。如代碼for( ; ; ) 在microsoft visual studio 2010內建開發環境vc++的debug模式下将生成如下彙編代碼:

相比之下,while語句就不一樣了。按照while的文法規則,while() 語句中必須有一個表達式(這裡是1)判斷條件,生成的代碼用它進行條件跳轉。即while語句()屬于有條件循環,有條件就要判斷條件是否成立,是以其相對于for( ; ; ) 語句需要多幾條指令。如代碼while (1) 在microsoft visual studio 2010內建開發環境vc++的debug模式下将生成如下彙編代碼:

根據上面的分析結果,很顯然,for( ; ; ) 語句指令少,不占用寄存器,而且沒有判斷、跳轉指令。當然,如果從實際的編譯結果來看,兩者的效果常常是一樣的,因為大部分編譯器都會對while (1) 語句做一定的優化。但是,這還需要取決于編譯器。是以,我們還是應該優先選用for( ; ; ) 語句。

建議22-2:優先使用for循環替代do/while與while循環

在c語言中,while循環與do/while循環的差別在于:while循環語句先測試控制表達式的值,再執行循環體,如下面的示例代碼所示:

相比之下,do/while循環語句則先執行循環體,再測試控制表達式的值,如下面的示例代碼所示:

如果控制表達式的值一開始為假,則while循環語句的循環體一次都不執行,而do/while循環語句的循環體仍然要執行一次再跳出循環。

在實際開發環境中,無論是do/while與while循環,還是for循環,它們之間都是可以互相替換的。但從代碼的可讀性而言,建議優先選用for循環。尤其面對多層循環嵌套,for循環的代碼相比之下就更易讀懂了。當然,如果在循環的次數不明确的情況下,還是要使用do/while和while循環。

繼續閱讀