21天學習C語言-第五天

函數是C的核心和理念。編程

函數的定義

函數是一個有名字的獨立代碼塊,這個代碼塊能完成指定的功能,有時候會返回值給調用程序。函數

  1. 函數有惟一的名稱。
  2. 函數是獨立的,函數能不被其餘打斷。
  3. 函數能完成指定的功能。
  4. 函數能返回值給調用程序。

函數如何工做

函數在被調用時執行,當一個函數被調用,調用者會把數據做爲參數傳給函數,參數被函數用來執行特定的邏輯,好比求平方。接下來函數內的語句開始執行,執行完畢後把所獲得的結果返回給函數調用者。spa

clipboard.png

函數和結構化

經過使用函數,能夠實現結構化編程,把實現某一功能的代碼獨立出來,包裝成函數,在須要的地方進行調用,上圖的square就是這樣的代碼。.net

結構化的好處

  1. 把一個複雜的邏輯拆分紅小的任務,代碼可讀性高。
  2. 調試起來簡單,因爲函數的獨立性,能夠快速定位到問題的位置。
  3. 增長之後的開發效率,也就是函數的可重用性,遇到重複或者類似的功能,代碼可直接拿過來用。

如何結構化

肯定要實現的目標,將目標細分爲幾步,每步是定爲一個函數。如求平方中,總共有兩步,肯定要作的是求2的平方並打印出來。第一步是求平方,第二步是打印,由於打印是系統提供的函數,咱們只把求的過程獨立出來就好。調試

自上而下執行

函數按自上至下順序執行(暫不說控制語句),執行完一個以後繼續執行下一個。有的時候,main函數中代碼量不多,僅僅是調用函數的語句。實際實現功能的代碼都在各個被調用的函數當中,就行菜單同樣,main函數只是至關於一個目錄,真正的實現都在點擊事件對應的函數當中。栗子,邏輯都在show函數中執行:code

clipboard.png

寫一個函數

寫函數最重要的就是知道想要什麼,有了目標,寫函數就容易許多。函數由三部分組成,函數頭,函數體和函數原型。有些時候,函數原型能夠省略。blog

函數頭

函數頭由三部分組成,類型,名稱和參數。遞歸

  1. 函數類型也就是函數執行後返回值的類型,能夠是當前C中的任意類型好比int,char等。
  2. 函數名稱是函數的惟一標識,能夠隨意叫什麼,不過最好是能見名知意。
  3. 參數,多數函數都有參數,參數就是要處理的數據,參數需指明類型,多個參數用逗號隔開。

函數體

函數體是函數邏輯的具體實現部分,用大括號包裹,在函數頭以後。通常包括局部變量聲明,函數語句,和返回語句。事件

  1. 局部變量是在函數內部聲明的,用於存儲當前函數的臨時數據。爲了可讀性,局部變量儘可能不要和函數外部的變量重名。
  2. 函數語句是函數邏輯的具體實現部分,函數仍然能夠調用其餘函數。對於函數的長度,雖然沒有限制,不過相對的短一些比較好。若是函數過長,那麼函數執行的任務可能須要再次拆分。
  3. 返回值是函數對參數執行邏輯以後得出的最終結果,返回給調用者的值。

函數原型

函數原型的做用是將函數的類型,名稱,參數信息告訴編譯器,方便編譯器對函數調用作檢查。實驗中發現,編譯器會對類型,名稱作嚴格的檢查,若是不一致就會報錯。參數檢查比較複雜,函數原型的參數類型和對應函數的參數類型必定要相同,個數能夠相同或者函數原型不寫任何參數。可是函數原型若是有參數而且和函數的參數個數不等,則會報錯。函數原型能夠的參數能夠不寫名稱,或者寫其餘名稱。ip

調用函數

在須要的位置,寫被調用函數的名稱並在後面添加括號,括號內爲函數須要的參數,若是函數不須要參數,括號置空便可。能夠將函數的返回值賦值給變量,也能夠做爲其餘函數的參數。
遞歸是調用函數自身,在一些特殊的運算中會常常出現遞歸,好比求階乘。遞歸比較耗資源,非必要的時候不要用。

函數位置

目前階段比較簡單,代碼放在一個文件中就好。實際上,函數通常會分開不一樣的文件放置,在須要調用的地方引入頭文件(.h文件)。好比printf函數,咱們引入了stdio.h以後就能用,可是printf的函數並未在咱們當前的文件中定義。

內聯函數(Inline Functions)

對於使用頻繁而且體量小的函數,能夠在函數前用inline關鍵字修飾。內聯函數的做用就是在函數編譯的時候將函數的內容總體複製到調用的位置,減小函數調用帶來的資源消耗。很明顯,內聯函數會增長代碼的編譯時間和編譯後程序的體量。inline關鍵字要放在函數實現部分,放在函數原型前是沒有做用的。