函數是C的核心和理念。編程
函數
是一個有名字的獨立代碼塊,這個代碼塊能完成指定的功能,有時候會返回值給調用程序。函數
函數在被調用時執行,當一個函數被調用,調用者會把數據做爲參數傳給函數,參數被函數用來執行特定的邏輯,好比求平方。接下來函數內的語句開始執行,執行完畢後把所獲得的結果返回給函數調用者。spa
經過使用函數,能夠實現結構化編程,把實現某一功能的代碼獨立出來,包裝成函數,在須要的地方進行調用,上圖的square就是這樣的代碼。.net
肯定要實現的目標,將目標細分爲幾步,每步是定爲一個函數。如求平方中,總共有兩步,肯定要作的是求2的平方並打印出來。第一步是求平方,第二步是打印,由於打印是系統提供的函數,咱們只把求的過程獨立出來就好。調試
函數按自上至下順序執行(暫不說控制語句),執行完一個以後繼續執行下一個。有的時候,main函數中代碼量不多,僅僅是調用函數的語句。實際實現功能的代碼都在各個被調用的函數當中,就行菜單同樣,main函數只是至關於一個目錄,真正的實現都在點擊事件對應的函數當中。栗子,邏輯都在show函數中執行:code
寫函數最重要的就是知道想要什麼,有了目標,寫函數就容易許多。函數由三部分組成,函數頭,函數體和函數原型。有些時候,函數原型能夠省略。blog
函數頭
由三部分組成,類型,名稱和參數。遞歸
函數體
是函數邏輯的具體實現部分,用大括號包裹,在函數頭以後。通常包括局部變量聲明,函數語句,和返回語句。事件
函數原型的做用是將函數的類型,名稱,參數信息告訴編譯器,方便編譯器對函數調用作檢查。實驗中發現,編譯器會對類型,名稱作嚴格的檢查,若是不一致就會報錯。參數檢查比較複雜,函數原型的參數類型和對應函數的參數類型必定要相同,個數能夠相同或者函數原型不寫任何參數。可是函數原型若是有參數而且和函數的參數個數不等,則會報錯。函數原型能夠的參數能夠不寫名稱,或者寫其餘名稱。ip
在須要的位置,寫被調用函數的名稱並在後面添加括號,括號內爲函數須要的參數,若是函數不須要參數,括號置空便可。能夠將函數的返回值賦值給變量,也能夠做爲其餘函數的參數。遞歸
是調用函數自身,在一些特殊的運算中會常常出現遞歸,好比求階乘。遞歸比較耗資源,非必要的時候不要用。
目前階段比較簡單,代碼放在一個文件中就好。實際上,函數通常會分開不一樣的文件放置,在須要調用的地方引入頭文件(.h文件)。好比printf函數,咱們引入了stdio.h以後就能用,可是printf的函數並未在咱們當前的文件中定義。
對於使用頻繁而且體量小的函數,能夠在函數前用inline關鍵字修飾。內聯函數的做用就是在函數編譯的時候將函數的內容總體複製到調用的位置,減小函數調用帶來的資源消耗。很明顯,內聯函數會增長代碼的編譯時間和編譯後程序的體量。inline關鍵字要放在函數實現部分,放在函數原型前是沒有做用的。