本文爲我的讀書筆記,僅供記錄學習過程當中遇到的往後須要留意的問題,若有相關版權問題請及時通知做者。
編碼風格
一、每個函數都必須有註釋。
頭部說明須要包含的內容和次序
二、每一個函數定義結束以後以及每一個文件結束以後都要加一個或若干個空行
三、在一個函數體內,變量定義與函數語句之間要加空行
四、邏輯上密切相關的語句之間不加空行,其它地方應加空行分隔。
五、複雜的函數中,循環語句結束以後須要適當的註釋,方便區分各分支或循環體
六、修改別人代碼的時候不要輕易刪除別人的代碼,應該用適當的註釋方式
七、用縮行顯示程序結構,縮進量統一4個字符,不適用TAB縮進。
八、在函數體的開始、結構/聯合的定義、枚舉的定義以及循環、判斷等語句中的代碼都要採用縮行。
九、同層次的代碼在同層次的縮進層上
十、最大長度控制在80個字符之內,較長的語句、表達式要分多行書寫
十一、長表達式要在低優先級操做符處劃分新行,操做符放在新行之首。拆分出來的新行要進行適當的縮進,使排整齊。
十二、若是函數中的參數較長,要進行適當的劃分。
1三、用正確的反義詞組命名具備互斥意義的變量或相反動做的函數
1四、若是代碼行中的運算符比較多,用括號肯定表達式的操做順序,避免使用默認的優先級。
1五、不要編寫太複雜的符合表達式
1六、不要有多用途的符合表達式
1七、儘可能避免含有否認運算符的條件表達式
1八、參數的書寫要完整,不要省略參數名。若是函數沒有參數,則用void填充。
函數設計的通常原則和技巧
1九、少用全局變量。各個源文件負責自己文件的全局變量,同時提供一對對外函數,方便其餘函數使用該函數來訪問變量。不要直接讀寫全局變量,尤爲是在多線程編程時,必須使用set/get的方式,而且對讀寫操做加鎖。
20、參數命名要恰當、順序要合理。通常應將目的參數放在前面,源參數放在後面
2一、若是參數是指針,且僅做輸入參數用,則應在類型前加const,方式該指針在函數體內被意外修改。
2二、不要省略返回值的類型,若是函數沒有返回值,那麼應聲明爲void類型。若是沒有返回值,編譯器則默認函數的返回值是int類型的。
2三、在函數體的入口處,對參數的有效性進行檢查,尤爲是指針參數,儘可能使用assert宏做入口校驗,而不使用if語句校驗。
2四、return語句不可返回指向棧內存的指針,由於該內存在函數體結束時被自動銷燬。
2五、函數的功能要單一,不要涉及多用途的函數。
2六、函數體的規模要效,儘可能控制在80行之內。
2七、相同的輸入應當產生相同的輸出。儘可能避免函數帶有記憶功能。帶有記憶功能的函數其行爲是不可預測的,由於他的行爲可能取決於某種記憶狀態。這樣的函數不利於測試和維護。在C語言中,函數的static局部變量是函數的記憶存儲器。儘可能少使用static,除非必須。
2八、避免函數有太多的參數,儘可能控制在4個之內。
2九、儘可能不要使用類型和數目不肯定的參數。
C標準庫函數printf是採用不肯定參數的典型表明,函數原型:
int printf(const chat *format[,argument]……);
這種風格的函數在編譯時喪失了嚴格的類型安全檢查。
30、有時候函數不須要返回值,單位了增長靈活性如支持鏈式表達,能夠附加返回值。
3一、不只要檢查輸入參數的有效性,還要檢查經過其餘途徑進入函數體內的變量的有效性,如全局變量、文件句柄等。
3二、函數名與返回值類型在語義上不可衝突
違反的典型表明是 getchar。其返回值是int型,函數原型:
int getchar(void);
如:
char c
;
c = getchar();
if(EOF == c)
{
…
}
char型的取值範圍是[-128,127],若是宏EOF的值在char的取值範圍以外,EOF的值將沒法所有保存到c內,會發生截斷,將EOF值的低8位保存到c裏。這樣if語句有可能老是失敗。
遞歸調用
儘可能不要用遞歸。要用的時候注意遞歸層次不要太深,防止棧溢出;遞歸的中止條件必定要正確,不然,遞歸可能沒完沒了。