要寫好C語言程序,最重要的當然是把要解決的問題分析清楚,設計好解決問題的方案和通過計算實現求解的過程,對問題的求解過程進行科學的結構化的分解。在此基礎上進一步考慮如何寫程序的時候,下面的建議可能有所幫助。
這些建議中有些是一般性的,不僅僅對C語言程序設計有效;也有些是特別針對C語言程序設計的。這個表還會進一步修改和擴充,歡迎提出意見。
________________________________________
1)應該特別注意程序的書寫格式,讓它的形式反映出其內在的意義結構。
程序是最復雜的東西(雖然你開始寫的程序很簡單,但它們會逐漸變得復雜起來),是需要用智力去把握的智力產品。良好的格式能使程序結構一目了然,幫助你和別人理解它,幫助你的思維,也幫助你發現程序中不正常的地方,使程序中的錯誤更容易被發現。
人們常用的格式形式是:邏輯上屬于同一個層次的互相對齊;邏輯上屬于內部層次的推到下一個對齊位置。請參考本課程的教科書或《C程序設計語言》(The C Programming Language,Brian W. Kernighan & Dennis M. Rirchie,清華大學出版社,大學計算機教育叢書(影印版,英文),1996。)
利用集成開發環境(IDE)或者其他程序編輯器的功能,可以很方便地維護好程序的良好格式。請注意下面這幾個鍵,在寫程序中應該經常用到它們:Enter鍵(換一行),Tab鍵(將輸入光標移到下一個對齊位置——進入新的一個層次),Backspace鍵(回到前一個對齊位置——退到外面的一個層次)。
________________________________________
2)用最規范的、最清晰的、最容易理解的方式寫程序。注意人們在用C語言寫程序的習慣寫法,例如教科書中解決類似問題時所使用的寫法,《C程序設計語言》一書中有許多極好的程序實例。在這里有一個關于程序模式的相關網頁,里面也列出了一些常用的模式。
C語言是一個非常靈活的語言,你可能在這里用許多非常隱晦的方式寫程序,但這樣寫出的程序只能是作為一種玩意兒,就像謎語或者智力游戲。這些東西可以用于消磨時間,但通常與實際無緣。在我們的C語言討論組里提到過這種東西。
________________________________________
3)在編程中,應仔細研究編譯程序給出的錯誤信息和警告信息,弄清楚每條信息的確切根源并予以解決。特別是,不要忽略那些警告信息,許多警告信息源自隱含的嚴重錯誤。我們有許多辦法去欺騙編譯程序,使它不能發現我們程序中的錯誤,但這樣做最終受到傷害的只能是自己。
________________________________________
4)隨時注意表達式計算過程和類型。注意運算符的優先級和結合順序,不同類型的運算對象將怎樣轉換,運算的結果是什么類型的,等等。在必要的時候加上括號或顯式的類型強制轉換。
C語言的運算符很多,優先級定義也不盡合理,很難完全記清楚,因此要特別注意。需要時查一查(不要怕麻煩,相關網頁有運算符表),或者直接按照自己的需要加上幾個括號。
________________________________________
5)絕不去寫依賴于運算對象求值順序的表達式。對于普通二元運算符的運算對象,函數調用的各個實際參數,C語言都沒有規定特定求值順序。因此,我們不應該寫那種依賴于特定求值順序的表達式,因為不能保證它一定得到什么結果。例如下面的表達式和函數調用都是不合適的,很可能產生你預料不到的結果:
scanf("%d %d", i++, a[i]);
m = n * n++;
________________________________________
6)總保證一個函數的定義點和它的所有使用點都能看到同一個完整的函數原型說明。參看《從問題到程序》第103-107頁。
________________________________________
7)總注意檢查數組的界限和字符串(也以數組的方式存放)的結束。C語言內部根本不檢查數組下標表達式的取值是否在合法范圍內,也不檢查指向數組元素的指針是不是移出了數組的合法區域。寫程序的人需要自己保證對數組使用的合法性。越界訪問可能造成災難性的后果。
例:在寫處理數組的函數時一般應該有一個范圍參數;處理字符串時總檢查是否遇到空字符'\0'。
________________________________________
8)絕不對空指針或者懸空的指針做間接訪問。這種訪問的后果不可預料,可能造成系統的破壞,也可能造成操作系統發現這個程序執行非法操作而強制將它終止。
________________________________________
9)對于所有通過返回值報告運行情況或者出錯信息的庫函數,都應該檢查其執行是否正常完成。如果庫函數沒有完成操作(可能因為各種原因),隨后的操作有可能就是非法的。這種錯誤也可能在程序運行中隱藏很長時間,到很后來才暴露出來,檢查錯誤非常困難。
________________________________________
10)在帶參數宏的定義字符串中,一般應該給整個字符串和其中出現的每個參數都加括號。
C語言預處理程序是個簡單的文本替換程序,它根本不知道C語言的語法結構、優先級規則等。不寫括號有時會產生我們不希望的代換結果。
________________________________________
11)所有外部變量名字、所有函數名字,應該只靠前6個字符就能夠互相區分。因為有些老的編譯程序只關注這些名字的前6個字符。如果不注意這個問題,就可能引起隱含的連接錯誤。
________________________________________
有關如何寫好程序,如何將自己發展成為一個高水平的計算機工作者(真正的高級程序工作者,而不是那種拿證書的所謂“高級程序員”)還需要進一步學習和實踐。如果希望向這個方向努力,我翻譯的一本書可能對你有所幫助:
《程序設計實踐》,(The Practice Of Programming, Brian W. Kernighan & Bob Pike 1999)。機械工業出版社2000。這本書討論了程序設計的許多重要的實踐性問題,值得每個學過一個程序設計語言,有些程序設計經驗,熱愛或夢想在計算機領域工作的人閱讀參考。在這里可以看到原書的前言和章節表。還有我為該書中文版寫的譯者序言。
?
posted on 2007-01-29 12:39
天下無雙 閱讀(808)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++