在學習C語言編程時,總會提到C是面向過程編程,與面向對象編程對應的。面向過程編程老是顯得低人一等,須要控制程序執行的每一個過程,面向對象編程,只要實現了類以後,調用很是方便同樣。在C++的發展下,C好像愈來愈不入流了,更不用說C指針的各類問題,內存泄漏和越界訪問數據,這一切好像只有在C語言中才存在。可是C++也是存在的,做爲C的超集語言,C++最大的問題就是太完備了,太複雜了,這一切的一切就是可能須要幾年才能真正入門C++。在Java和Python的比較下,C也是有本身優點的,能夠面向硬件編程,控制程序執行的每個過程,接近彙編語言的效率,和彙編語言的零距離融合,內鏈函數的應用,bootloader的應用,驅動程序的編寫,嵌入式設備的興起,物聯網的崛起、工業革命這一切都是C的契機,沒法想象,沒有C語言,生活會變成什麼樣子,所以C語言仍是值得學的。編程
學習C語言的都知道,C語言的核心之一就是函數,函數包括函數簽名和函數體。數組
1、函數的簽名與函數體:函數簽名--函數的類型、函數的名稱、函數的參數列表模塊化
一、函數的類型:函數的返回值類型,能夠是基本類型或符合類型,也能夠是void類型(表示沒有返回值);函數
二、函數的名稱:標識符經常用動名結構的短語,能代表函數的功能最好,不要和已有的函數重名便可;學習
三、函數的參數列表:能夠在調用函數時傳入的參數,參數列表包括傳入參數的類型和傳入參數的順序;測試
四、函數體:本質是語句塊,完成代碼的初級封裝,決定了變量的做用域和程序的執行時序;優化
2、函數的接口化,將一個功能用一個頭文件和實現模塊化:指針
一、將數據定義和函數聲明放置到頭文件中;對象
二、在頭文件中說明函數的功能、函數的調用方法、函數的傳參要求和函數的錯誤代碼,便於用戶使用該模塊;遞歸
三、在模塊對應的實現文件中包含模塊的頭文件,方便數據的應用;
四、實現對應函數的功能,建議函數不要超過2×24=48行代碼,邏輯必須簡單也能夠;
五、有條件時應該附上測試函數的應用及測試方法等;
六、函數沒有返回值也能夠調用return語句,若是沒有ruturn語句,在碰到}後,編譯器會執行返回語句;
七、函數實現過程當中,儘可能避免Dead Code(永遠都沒法執行的代碼);
八、函數實現過程當中,不該該出現大量重複代碼,不然,應該抽象出一個函數封裝重複代碼;
3、函數的調用,除了main()由系統調用外,其餘函數原則上都是有main函數調用的;
一、調用沒有返回值的函數,一般用來實現數據的輸出或程序狀態的改變,無需返回值,直接functionName(實參);
二、調用有返回值的函數,需定義與函數類型相同的變量,完成函數返回數據的接受工做,type typeData = functionName(參數);
三、調用函數原則上只能有一個返回值,若是須要返回多個函數,能夠考慮返回指針、數組或符合類型等;
四、調用函數時傳入的實參的類型和順序及數量必須與形參徹底一致;
五、經過調用函數,實現程序執行細節和數據操做的動做隱藏;
4、增量式開發,實現代碼從零開始到功能實現的過程:
一、模塊劃分,複雜功能分割成小功能的模塊,最終到只須要簡單幾個語句就能完成功能的小模塊便可;
二、功能具體化;
三、搭建函數的實現模板;
四、填充必要的代碼實現;
五、實現代碼功能的測試,若是功能正常,則代碼實現正常;
六、代碼測試功能不正常,引入臨時變量並添加附加的語句,實現數據的監控,修改必要代碼,直至代碼功能正常;
七、將附加語句註釋,保留必要核心代碼便可;
八、添加必要的註釋,完成代碼的完善便可。
5、代碼重構,主要實現代碼的優化和透明化修改:
一、代碼重構時,儘可能不要刪除已有的實現,能夠再次實現;
二、代碼重構時,能夠添加新的功能;
三、代碼重構時應實現代碼應用的透明化;
6、遞歸,概念自身在定義時用到概念自己,
一、遞歸的首要條件是基礎條件;
二、遞歸的必須條件是遞歸方法;
三、遞歸的必要條件是遞歸規模減少的方法;