第6講 函數
函數讓代碼變得更加簡潔。
結構化程序設計:
????????基本思想是采用自頂向下、逐步細化的設計方法和單入單出的控制結構。
????????理念是將大型程序分解成小型、便于管理的任務,如果其中的一項任務仍然過大,則將它分解成為更小的任務,直到將程序劃分為小型的、易于編寫的模塊。
1. 函數基礎
一個典型的函數定義包括以下部分:返回類型、函數名字、由0個或多個形參組成的列表以及函數體。
1.1 編寫函數
我們來編寫一個求階乘的程序。程序如下所示:
函數名字是fact,它作用于一個整型參數,返回一個整型值。return語句負責結束fact并返回ret的值。
1.2 調用函數
函數的調用完成兩項工作:一是用實參初始化函數對應的形參,二是將控制權轉移給被調用函數。此時,主調函數的執(zhí)行被暫時中斷,被調函數開始執(zhí)行。
1.3 形參和實參
實參是形參的初始值。第一個實參初始化第一個形參,第二個實參初始化第二個形參,依次類推。形參和實參的類型和個數必須匹配。
形參也可以設置默認值,但所有默認值必須是最后幾個。當傳入的實參個數少于形參個數時,最后沒有被傳入值的形參會使用默認值。
1.4 函數的形參列表
函數的形參列表可以為空,但是不能省略。
形參列表中的形參通常用逗號隔開,其中每個形參都是含有一個聲明符的聲明。即使兩個形參的類型一樣,也必須把兩個類型都寫出來:
1.5 函數返回類型
大多數類型都能用作函數的返回類型。一種特殊的返回類型是void,它表示函數不返回任何值。函數的返回類型不能是數組類型或函數類型,但可以是指向數組或者函數的指針。
1.6 局部變量、全局變量與靜態(tài)變量
局部變量只可以在函數內部使用,全局變量可以在所有函數內使用。當局部變量與全局變量重名時,會優(yōu)先使用局部變量。靜態(tài)變量static等于在函數內部開了一個只有該函數能使用的全局變量。
2. 參數傳遞
2.1 傳值參數
當初始化一個非引用類型的變量時,初始值被拷貝給變量。此時,對變量的改動不會影響初始值。
2.2 傳引用參數
當函數的形參為引用類型時,對形參的修改會影響實參的值。使用引用的作用:避免拷貝、讓函數返回額外信息。
2.3 數組形參
在函數中對數組中的值的修改,會影響函數外面的數組。
一維數組形參的寫法:
多維數組形參的寫法:
2.4 默認參數: int foo(int a, int b = 10) //默認參數不能出現在前面,無傳值就用默認值
3. 返回類型和return語句
return語句終止當前正在執(zhí)行的函數并將控制權返回到調用該函數的地方。return語句有兩種形式:
3.1 無返回值函數
沒有返回值的return語句只能用在返回類型是void的函數中。返回void的函數不要求非得有return語句,因為在這類函數的最后一句后面會隱式地執(zhí)行return。
通常情況下,void函數如果想在它的中間位置提前退出,可以使用return語句。return的這種用法有點類似于我們用break語句退出循環(huán)。
3.2 有返回值的函數
只要函數的返回類型不是void,則該函數內的每條return語句必須返回一個值。return語句返回值的類型必須與函數的返回類型相同,或者能隱式地轉換函數的返回類型。
4. 函數遞歸(遞歸不能說是一種算法,只能說是函數調用自己的一種形式)
在一個函數內部,也可以調用函數本身。
遞歸:遞推+回溯,循環(huán)可以用遞歸寫,遞歸不一定能用循環(huán)(不知道循環(huán)多少層)
備注:
inline fact() 內聯函數,相當于調用時將函數體展開,無法進行函數遞歸
常用函數:
向下取整 floor(x) 向上取整 ceil(x) 四舍五入 round(x)
自然對數 log(x) 平方根 sqrt(x) 實數絕對值 fabs(x)