日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编程修养(五)

發布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程修养(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
16、把相同或近乎相同的代碼形成函數和宏
—————————————————————


有人說,最好的程序員,就是最喜歡“偷懶”的程序,其中不無道理。


如果你有一些程序的代碼片段很相似,或直接就是一樣的,請把他們放在一個函數中。而如果這段代碼不多,而且會被經常使用,你還想避免函數調用的開銷,那么就把他寫成宏吧。


千萬不要讓同一份代碼或是功能相似的代碼在多個地方存在,不然如果功能一變,你就要修改好幾處地方,這種會給維護帶來巨大的麻煩,所以,做到“一改百改”,還是要形成函數或是宏。


?


17、表達式中的括號
—————————


如果一個比較復雜的表達式中,你并不是很清楚各個操作符的憂先級,即使是你很清楚優先級,也請加上括號,不然,別人或是自己下一次讀程序時,一不小心就看走眼理解錯了,為了避免這種“誤解”,還有讓自己的程序更為清淅,還是加上括號吧。


比如,對一個結構的成員取地址:


? ? GetUserAge( &( UserInfo->age ) );


雖然,&UserInfo->age中,->操作符的優先級最高,但加上一個括號,會讓人一眼就看明白你的代碼是什么意思。


再比如,一個很長的條件判斷:


if ( ( ch[0] >= '0' || ch[0] <= '9' ) &&
? ? ?( ch[1] >= 'a' || ch[1] <= 'z' ) &&
? ? ?( ch[2] >= 'A' || ch[2] <= 'Z' ) ? ?)
? ? ?
括號,再加上空格和換行,你的代碼是不是很容易讀懂了? ? ?




18、函數參數中的const
———————————


對于一些函數中的指針參數,如果在函數中只讀,請將其用const修飾,這樣,別人一讀到你的函數接口時,就會知道你的意圖是這個參數是[in],如果沒有const時,參數表示[in/out],注意函數接口中的const使用,利于程序的維護和避免犯一些錯誤。


雖然,const修飾的指針,如:const char* p,在C中一點用也沒有,因為不管你的聲明是不是const,指針的內容照樣能改,因為編譯器會強制轉換,但是加上這樣一個說明,有利于程序的閱讀和編譯。因為在C中,修改一個const指針所指向的內存時,會報一個Warning。這會引起程序員的注意。


C++中對const定義的就很嚴格了,所以C++中要多多的使用const,const的成員函數,const的變量,這樣會對讓你的代碼和你的程序更加完整和易讀。(關于C++的const我就不多說了)


?


19、函數的參數個數(多了請用結構)
—————————————————


函數的參數個數最好不要太多,一般來說6個左右就可以了,眾多的函數參數會讓讀代碼的人一眼看上去就很頭昏,而且也不利于維護。如果參數眾多,還請使用結構來傳遞參數。這樣做有利于數據的封裝和程序的簡潔性。


也利于使用函數的人,因為如果你的函數個數很多,比如12個,調用者很容易搞錯參數的順序和個數,而使用結構struct來傳遞參數,就可以不管參數的順序。


而且,函數很容易被修改,如果需要給函數增加參數,不需要更改函數接口,只需更改結構體和函數內部處理,而對于調用函數的程序來說,這個動作是透明的。


?




20、函數的返回類型,不要省略
——————————————


我看到很多程序寫函數時,在函數的返回類型方面不太注意。如果一個函數沒有返回值,也請在函數前面加上void的修飾。而有的程序員偷懶,在返回int的函數則什么不修飾(因為如果不修飾,則默認返回int),這種習慣很不好,還是為了原代碼的易讀性,加上int吧。


所以函數的返回值類型,請不要省略。


另外,對于void的函數,我們往往會忘了return,由于某些C/C++的編譯器比較敏感,會報一些警告,所以即使是void的函數,我們在內部最好也要加上return的語句,這有助于代碼的編譯。


?




21、goto語句的使用
—————————


N年前,軟件開發的一代宗師——迪杰斯特拉(Dijkstra)說過:“goto statment is harmful !!”,并建議取消goto語句。因為goto語句不利于程序代碼的維護性。


這里我也強烈建議不要使用goto語句,除非下面的這種情況:




? ? #define FREE(p) if(p) { /
? ? ? ? ? ? ? ? ? ? ? ? free(p); /
? ? ? ? ? ? ? ? ? ? ? ? p = NULL; /
? ? ? ? ? ? ? ? ? ? }


? ? main()
? ? {
? ? ? ? char *fname=NULL, *lname=NULL, *mname=NULL;


? ? ? ? fname = ( char* ) calloc ( 20, sizeof(char) );
? ? ? ? if ( fname == NULL ){
? ? ? ? ? ? goto ErrHandle;
? ? ? ? }


? ? ? ? lname = ( char* ) calloc ( 20, sizeof(char) );
? ? ? ? if ( lname == NULL ){
? ? ? ? ? ? goto ErrHandle;
? ? ? ? }


? ? ? ? mname = ( char* ) calloc ( 20, sizeof(char) );
? ? ? ? if ( mname == NULL ){
? ? ? ? ? ? goto ErrHandle;
? ? ? ? }
? ? ? ??
? ? ? ? ......
? ? ?
? ? ? ??
? ? ?ErrHandle:
? ? ? ? FREE(fname);
? ? ? ? FREE(lname);
? ? ? ? FREE(mname);
? ? ? ? ReportError(ERR_NO_MEMOEY);
? ? ?}


也只有在這種情況下,goto語句會讓你的程序更易讀,更容易維護。(在用嵌C來對數據庫設置游標操作時,或是對數據庫建立鏈接時,也會遇到這種結構)


?




22、宏的使用
——————


很多程序員不知道C中的“宏”到底是什么意思?特別是當宏有參數的時候,經常把宏和函數混淆。我想在這里我還是先講講“宏”,宏只是一種定義,他定義了一個語句塊,當程序編譯時,編譯器首先要執行一個“替換”源程序的動作,把宏引用的地方替換成宏定義的語句塊,就像文本文件替換一樣。這個動作術語叫“宏的展開”


使用宏是比較“危險”的,因為你不知道宏展開后會是什么一個樣子。例如下面這個宏:


? ? #define ?MAX(a, b) ? ? a>b?a:b


當我們這樣使用宏時,沒有什么問題: MAX( num1, num2 ); 因為宏展開后變成 num1>num2?num1:num2;。 但是,如果是這樣調用的,MAX( 17+32, 25+21 ); 呢,編譯時出現錯誤,原因是,宏展開后變成:17+32>25+21?17+32:25+21,哇,這是什么啊?


所以,宏在使用時,參數一定要加上括號,上述的那個例子改成如下所示就能解決問題了。


? ? #define ?MAX( (a), (b) ) ? ? (a)>(b)?(a):(b)
? ??
即使是這樣,也不這個宏也還是有Bug,因為如果我這樣調用 MAX(i++, j++); , 經過這個宏以后,i和j都被累加了兩次,這絕不是我們想要的。
? ??
所以,在宏的使用上還是要謹慎考慮,因為宏展開是的結果是很難讓人預料的。而且雖然,宏的執行很快(因為沒有函數調用的開銷),但宏會讓源代碼澎漲,使目標文件尺寸變大,(如:一個50行的宏,程序中有1000個地方用到,宏展開后會很不得了),相反不能讓程序執行得更快(因為執行文件變大,運行時系統換頁頻繁)。


因此,在決定是用函數,還是用宏時得要小心。


本文轉自:http://blog.csdn.net/haoel/article/details/2876

總結

以上是生活随笔為你收集整理的编程修养(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。