34 函式的本質及基本使用

2021-07-13 11:20:49 字數 2421 閱讀 7637

34.1.函式的作用及書寫規則

(1)整個程式分為多個原始檔,每個原始檔分為多個函式,每個函式分為多條語句,形成了整個程式的組織架構(原始檔->函式->語句,有利於分化問題、便於編寫程式、有利於多人協同合作);函式的發明是人(程式設計師和架構師)的需要(人的組織能力有限),而不是機器(編譯器、cpu)的需要;函式的目的是實現模組化程式設計,即為了提供程式的可移植性。

(2)函式的格式為函式的返回型別、函式名、引數列表等;函式不能太長也不宜太短,原則是1個函式只能做1件事;函式傳參不宜過多,在arm體系下,傳參不宜超過4個,超過4個則通過結構體打包,然後使用結構體指標傳參;在函式內部盡量少碰全域性變數,最好使用傳參、返回值和外部交換資料,不要使用全域性變數。

34.2.函式和變數的關係

(1)函式將來被編譯成可執行**段,變數(主要指全域性變數)經過編譯後變成資料或者在執行時變成資料,程式的執行需要**和資料共同結合才能完成。

(2)**和資料需要彼此配合,**是為了加工資料,資料必須借助**來起作用(資料是原材料,**是加工流水線);名詞性的資料必須經過動詞性的加工才能變成最終我們需要的產出的資料,這個加工的過程即程式的執行過程。

(3)在面相物件中分別叫方法和成員,某個類中的屬性可以通過成員表示,而動作可以通過方法表示,我們通過方法和成員可以描述某個類的所有特性。

34.3.函式即資料處理器

(1)程式執行的主要目標是生成目標資料;我們必須通過原材料+加工演算法得到目標資料,原材料即程式的輸入資料,加工演算法即程式;程式的編寫和執行即為了把原資料加工成目標資料,則程式的實質就是資料處理器。

(2)函式就是程式的縮影,函式的引數列表即輸入原材料資料,函式的返回值和輸出型引數即輸出目標資料,函式的函式體裡的那些**即加工演算法。

(3)函式在靜止沒有執行時只占用儲存空間並不占用資源(cpu+記憶體);函式的執行需要耗費資源(cpu+記憶體);函式執行時可以對資料加工生成目標資料,函式執行完畢會釋放占用的資源。

(4)整個程式的執行其實就是很多個函式相繼執行的連續過程。

34.4.函式的三要素

(1)函式三要素(定義、宣告、呼叫),函式的定義就是函式體、函式宣告是函式原型、函式呼叫就是使用函式。

(2)函式定義是函式的根本,函式定義中的函式名即該函式在記憶體中的首位址,所以可以用函式名來呼叫執行這個函式(實質是指標解引用訪問);函式定義中的函式體是函式的執行關鍵,函式將來執行時主要就是執行函式體。

(3)函式宣告的主要作用是告訴編譯器函式的原型;函式呼叫就是呼叫執行某個函式。

34.5.函式的原型和作用

(1)函式原型就是函式的宣告(函式的函式名、返回值型別、引數列表);函式原型的主要作用就是給編譯器提供原型,讓編譯器在編譯程式時幫我們進行引數的靜態型別檢查。

(2)編譯器是以單個原始檔為單位編譯程式的(函式在**呼叫就必須在**宣告);編譯器工作時原始檔已經經過預處理了(巨集定義全部替換、標頭檔案包含全部原地展開);編譯器編譯檔案時是按照檔案中語句的先後順序進行編譯處理的。

(3)編譯器從原始檔的第1行開始編譯,遇到函式宣告時就會收到編譯器的函式宣告表中,然後繼續向後;當遇到1個函式呼叫時,就在編譯器的本檔案的函式宣告表中去查這個函式,看有沒有原型相對應的函式(有且只能有1個);如果沒有或者只有部分匹配則會報錯或報警告;如果發現多個則會報錯或報警告(c語言中不允許2個函式原型完全1樣,該過程是在編譯器遇到函式定義時完成的,則函式可以重複宣告但是不能重複定義)。

34.6.遞迴函式及遞迴呼叫原理

(1)遞迴函式就是函式中呼叫了該函式本身的函式;遞迴不等於迴圈;遞迴函式解決的典型問題為求階乘、求斐波那契數列。

(2)實際上遞迴函式是在棧記憶體上遞迴執行的,每次遞迴執行1次就需要耗費一些棧記憶體;棧記憶體的大小是限制遞迴深度的重要因素。

(3)遞迴收斂性:遞迴函式必須有1個終止遞迴的條件,當每次該函式被執行時,我們判斷某個條件決定是否繼續遞迴,該條件最終必須能夠被滿足,若沒有遞迴終止條件或該條件永遠不能被滿足,則該遞迴沒有收斂性,其最終要失敗;

(4)遞迴棧溢位:因為遞迴是占用棧記憶體的,每次遞迴呼叫都會消耗一些棧記憶體,因此必須在棧記憶體耗盡之前遞迴收斂(終止),否則就會棧溢位,遞迴有風險,使用需謹慎。

34.recursive

/* * 公司:***x

* 部落格:

* github:

* 專案:函式的本質及基本使用

* 功能:演示遞迴實現階乘和斐波那契數列。

*/#include

int main(int argc, char **argv)

// 階乘

int factorial(int n)

if (1 == n)

else

}// 斐波那契數列

int fibonacci(int n)

else

if (0 == n)

else

if ((1==n) || (2==n))

else

}

實驗3 4 函式的使用

實驗目的 1.體會 函式只是把使用者的輸入變成輸出 的含義。2.通過數學函式的使用,學會正確使用函式。實驗步驟 1.數學庫中的abs函式用於求乙個整數的絕對值,其首部為int abs int n 因此,使用該函式時需要,函式會返回。測試函式時可以用下表中的資料。輸入的資料 3預期的輸出 實際的輸出 ...

jquery ztree 3 4 基本使用

1 一般來說,一棵樹總是放在乙個單獨的頁面中。所以需要建立乙個單獨的頁面。2 引入jquery的基本庫,jquery ui庫,ztree的樣式表。css style.css css ztreestyle ztreestyle.css 3 在頁面中建立div 4 初始化樹,以下beforemodule...

箭頭函式的基本使用及特性

箭頭函式 也是一種定義函式的方式,新潮的函式寫法注 箭頭函式需注意部分 1,箭頭函式不能用new 2,箭頭函式如果返回值是乙個物件,一定要加 普通 const show 返回值為物件 const show 3,箭頭函式中的this指向的是上一層函式的主人 箭頭函式this問題 匿名函式中的this是...