《编写高质量代码:改善c程序代码的125个建议》——建议19:避免使用嵌套的“?:”...
本節書摘來自華章計算機《編寫高質量代碼:改善c程序代碼的125個建議》一書中的第3章,建議19,作者:馬 偉 更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。
建議19:避免使用嵌套的“?:”
在C語言中,“?:”運算符是if/else語句的另外一種表示形式,其一般形式如下所示:
Exp1 ? Exp2 : Exp3其中,Exp1、Exp2 與 Exp3都是表達式。程序首先對Exp1 求值,如果 Exp1 的值為真時,就對Exp2 求值并將其求值結果作為整個問號表達式的值;否則,就對Exp3 求值并將其求值結果作為整個問號表達式的值。
由于問號表達式語法的簡潔性,因此我們經常看到一些程序員在做判斷時只用“?:”,而從不使用if/else語句。如下面的示例代碼所示:
很顯然,相對于if/else語句,這樣的代碼看起來更加簡潔明了。但是,如果我們嵌套使用“?:”,那就不一樣了。如下面的示例代碼所示:
unsigned int f(unsigned int x) {return( (x<=1)?(1-x):(x==4)?2:(x+1) ); }在上面的代碼中,嵌套了兩層“?:”,它實際等效于下面的代碼:
unsigned int f(unsigned int x) {unsigned temp;if(x <= 1){if(x != 0){temp = 0;}else{temp = 1;}}else{if(x == 4) {temp = 2;}else{temp = x + 1;}}return temp; }從上面的代碼中可以看出,盡管嵌套使用“?:”可以使代碼變得簡潔,但代碼的可讀性卻因此降低了不少。這個時候有的程序員或許會說,嵌套使用“?:”不僅使代碼簡潔,更重要的是它比if/else語句能夠產生更加高效的代碼。但實際情況并非如此,有興趣的讀者不妨試一試下面的代碼,對兩者做個比較。
unsigned int f(unsigned int x) {unsigned temp;if( x <= 1 ){temp = 0; if( x == 0 ){temp = 1;}}else{temp = 2; if( x != 4 ){temp = x + 1;}}return temp ; }其實,使用“?:”運算符所存在的問題是:由于它很簡單,容易使用,看起來好像是產生高效代碼的理想方法。因此,程序員就不再尋找更好的解決方法了。更糟糕的是,有些程序員會將if/else語句全部轉換為“?:”來獲得所謂的高效解決方案。而實際上“?:”并不比if/else語句好,它們所產生的匯編代碼也基本相同。
因此,為了能夠提高程序的執行效率,我們應該將時間花在尋求可替代的高效算法上,而不是一味地追求以某個稍微不同的方式來實現同一個算法上。例如,我們可以將上面的代碼修改成下面這種更直接的實現方法:
甚至,我們還可以使用下面的列表方式來實現上面的示例程序,如下面的代碼所示:
unsigned int f(unsigned int x) {assert( x >= 0 && x <= 4 );static const unsigned temp[] ={1,0,3,4,2 };return temp[x] ; }總結
以上是生活随笔為你收集整理的《编写高质量代码:改善c程序代码的125个建议》——建议19:避免使用嵌套的“?:”...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《代码整洁之道:程序员的职业素养》一一1
- 下一篇: Linux集群和自动化维1.5.1 服务