函數(shù)和預(yù)處理PPT課件_第1頁
函數(shù)和預(yù)處理PPT課件_第2頁
函數(shù)和預(yù)處理PPT課件_第3頁
函數(shù)和預(yù)處理PPT課件_第4頁
函數(shù)和預(yù)處理PPT課件_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、4.1函數(shù)概述所謂函數(shù)就是一系列指令或語句的組合體,它有兩個(gè)目的: 功能分解 復(fù)用第1頁/共77頁4.2 函數(shù)定義和調(diào)用在使用函數(shù)時(shí),要先對(duì)函數(shù)進(jìn)行定義,確定它要實(shí)現(xiàn)的功能。函數(shù)的使用就是調(diào)用函數(shù)的過程。第2頁/共77頁4.2.1 函數(shù)定義 任何函數(shù)都由函數(shù)說明和函數(shù)體兩部分 形式如下: ()函數(shù)體;函數(shù)名是一個(gè)有效c+標(biāo)識(shí)符,其后面必須跟一對(duì)圓括號(hào)(),以區(qū)別于變量名及其他用戶定義的標(biāo)識(shí)名。函數(shù)類型即函數(shù)的返回值的類型,如果不需要函數(shù)有返回值,則只要定義函數(shù)的類型為void即可。形式參數(shù)表寫在括號(hào)中,各參數(shù)以逗號(hào)隔開,每個(gè)參數(shù)由參數(shù)類型和參數(shù)名表示。參數(shù)個(gè)數(shù)可以為,但圓括號(hào)不能省略。函數(shù)體由

2、在一對(duì)花括號(hào)中的若干條語句組成,用于實(shí)現(xiàn)這個(gè)函數(shù)執(zhí)行的功能。注:C+不允許在一個(gè)函數(shù)體中再定義另一個(gè)函數(shù)第3頁/共77頁輸入兩整數(shù):9 5 9+ 5- 14 9- 5- 4 9* 5- 45void mainint m1,m2,sum;cout輸入兩整數(shù): m1m2;coutsetw(10)m1endl;cout+setw(9)m2endl; for(int i=0;i10;i+)cout(-);coutendl;coutsetw(10)m1+m2endl;coutsetw(10)m1endl;cout-setw(9)m2endl; for(int i=0;i10;i+)cout(-);cou

3、tendl;coutsetw(10)m1-m2endl;coutsetw(10)m1endl;cout*setw(9)m2endl; for(int i=0;i10;i+)cout(-);coutendl;coutsetw(10)m1*m2endl;第4頁/共77頁函數(shù)調(diào)用主調(diào)函數(shù)main()f();f();被調(diào)函數(shù)f()void f( )for(int i=0;i10;i+)cout(-);coutendl;函數(shù)名();void mainint m1,m2,sum;cout輸入兩整數(shù): m1m2;coutsetw(10)m1endl;cout+setw(9)m2endl; f();couts

4、etw(10)m1+m2endl;coutsetw(10)m1endl;cout-setw(9)m2endl; f()coutsetw(10)m1-m2endl;coutsetw(10)m1endl;cout*setw(9)m2endl; f()coutsetw(10)m1*m2endl;第5頁/共77頁函數(shù)的參數(shù) 函數(shù)可以有參數(shù) 函數(shù)定義時(shí),定義形式參數(shù)表:類型1 參數(shù)變量名1,類型2 參數(shù)變量名2 函數(shù)調(diào)用時(shí)傳入實(shí)際參數(shù): 數(shù)值1,數(shù)值2 實(shí)參可以是:常量、變量、表達(dá)式 實(shí)參要求:與形參個(gè)數(shù)相同,順序?qū)?yīng),類型相容void f(char c, int count)int i;for(i=0

5、;icount;i+)coutc;coutb)max=a;elsemax=b;return max;例:寫一個(gè)函數(shù),求兩個(gè)數(shù)的最大值void main()int m,n,x;cinmn;x=max(m,n);cout“較大值”xy)return x; return y; 函數(shù)返回值語法:return 表達(dá)式; 將return后面的值作為函數(shù)返回值,并將程序控制返回到調(diào)用此函數(shù)的位置處。 若函數(shù)類型為void,函數(shù)體中就不需要return語句或者return的后面什么也沒有。一旦執(zhí)行return語句,函數(shù)體return后面的語句就不在執(zhí)行void f (int n)if(n0)return;第8

6、頁/共77頁4.2.2函數(shù)的說明 函數(shù)必須先定義后調(diào)用 若函數(shù)定義在后而調(diào)用在前,需要在調(diào)用前進(jìn)行“函數(shù)的說明”。 說明一個(gè)函數(shù)的格式如下函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表);其中,形參的變量名可以省略。但要注意,函數(shù)說明的內(nèi)容應(yīng)與函數(shù)的定義相同。例:int max(int x,int y);int max(int,int);函數(shù)原型第9頁/共77頁4.2.3 函數(shù)調(diào)用 調(diào)用函數(shù)的一般形式如下: 函數(shù)名(實(shí)際參數(shù)表) 實(shí)際參數(shù)與形參相對(duì)應(yīng),它是實(shí)際調(diào)用函數(shù)時(shí)所給定的常量,變量或表達(dá)式。 一般地,僅當(dāng)函數(shù)被調(diào)用時(shí),系統(tǒng)才會(huì)給形參分配內(nèi)存單元,而調(diào)用結(jié)束后,形參所占用的內(nèi)存單元又被釋放。 第10頁/共7

7、7頁例: 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。#includefloat max(float , float );void main()float a, b;cout輸入兩個(gè)實(shí)數(shù):ab;couta和b中較大數(shù)為max(a, b) =y?x:y);main( )函數(shù)調(diào)用max(2.5,4.7 )函數(shù)max(2.5,4.7 )return 4.7 主程序后續(xù)語句第11頁/共77頁注意:注意:實(shí)參與形參的個(gè)數(shù)應(yīng)該相等,類型應(yīng)一致,且按順序?qū)崊⑴c形參的個(gè)數(shù)應(yīng)該相等,類型應(yīng)一致,且按順序一一對(duì)應(yīng)傳遞數(shù)據(jù)。一一對(duì)應(yīng)傳遞數(shù)據(jù)。在在c+中,調(diào)用一個(gè)函數(shù)的方式可以有很多,例如:中

8、,調(diào)用一個(gè)函數(shù)的方式可以有很多,例如:1. 作為一個(gè)語句不使用返回值作為一個(gè)語句不使用返回值max(3,4); 2. 作為表達(dá)式的一部分作為表達(dá)式的一部分int c=5*max(2,10); 3. 作為函數(shù)的實(shí)參作為函數(shù)的實(shí)參int c=0;c=max(max(c,4),10); 第12頁/共77頁4.3函數(shù)的參數(shù)傳遞 參數(shù)類型檢查 C+參數(shù)的傳遞方式:一種為按值傳遞,另一種為地址或引用傳遞。第13頁/共77頁1.按值傳遞 按值傳遞 參數(shù)傳遞的缺省初始化方式是把實(shí)參的值拷貝到形參的存儲(chǔ)區(qū)。 函數(shù)本身不對(duì)實(shí)參進(jìn)行操作,只是處理的實(shí)參的本地拷貝。也就是說,即使形參的值在函數(shù)中發(fā)生了變化,實(shí)參的值不

9、會(huì)受到影響。第14頁/共77頁#includefloat max(float ,float );void main()float a,b;cout輸入兩個(gè)實(shí)數(shù):ab;coutx和y中較大數(shù)為max(a,b) = y ? x : y );xyab第15頁/共77頁#includevoid swap(int x,int y) int temp=x; x=y; y=temp;void main() int a=2,b=10; swap (a,b); cout“a=“a“,b=“b cout endl;運(yùn)行結(jié)果:a=2,b=10該函數(shù)的參數(shù)是按值傳遞的,不對(duì)實(shí)參產(chǎn)生影響。如果想要實(shí)參值改變,不能用傳值

10、方法。形參及變量局部有效第16頁/共77頁2. 地址傳遞 是指在函數(shù)定義時(shí)將形參說明成指針。 調(diào)用函數(shù)時(shí)就需要指定地址值形式的實(shí)參。 地址傳遞方式的特點(diǎn)是可以通過改變形參(指針)所指向的變量來影響實(shí)參。第17頁/共77頁#includevoid swap(int *x,int *y) int temp=*x; *x=*y; *y=temp;void main()int a=2,b=10;swap(&a,&b); cout ”a=” a “,b=” b endl;本程序執(zhí)行結(jié)果如下:a=10 b=2這說明通過指針變量的形參可以實(shí)現(xiàn)函數(shù)的地址傳遞(有關(guān)指針內(nèi)容將在第五章介紹)。第1

11、8頁/共77頁3.引用傳遞 引用類型 引用是給已知變量起一個(gè)別名 當(dāng)建立引用時(shí),程序用另一個(gè)變量的名字來對(duì)其進(jìn)行初始化。 引用的聲明形式: &引用名=變量名 對(duì)引用的操作實(shí)際是對(duì)其引用的變量的操作int a,b=10;int &i=a;i=5; i=b;引用在聲明時(shí)必須初始化引用一旦聲明,就不能再成為其他變量的別名引用與被引用的變量指向同一內(nèi)存地址。a,i第19頁/共77頁例如:void swap(int & x, int & y) 按引用傳遞 在函數(shù)定義時(shí)將形參前面加上引用運(yùn)算符“&”。 實(shí)參傳遞為同類型的變量。形參成為實(shí)參的引用。 形參的任何操作都會(huì)

12、改變相應(yīng)的實(shí)參的數(shù)據(jù)。第20頁/共77頁#includevoid swap(int &x,int &y) int temp=x; x=y; y=temp;void main()int a=2,b=10;swap(a,b); cout ”a=” a “,b=” b endl;本程序執(zhí)行結(jié)果如下:a=10 b=2函數(shù)swap中的int &x和int &y就是形參的引用說明。第21頁/共77頁使用引用的目的在于 需要改變函數(shù)的實(shí)參值 大類型對(duì)象做函數(shù)參數(shù) 當(dāng)一個(gè)函數(shù)返回一個(gè)引用時(shí),它可以成為左值。第22頁/共77頁4.3.4 函數(shù)的默認(rèn)參數(shù)值 在C+中,允許在函數(shù)的說

13、明或定義時(shí)給一個(gè)或多個(gè)參數(shù)指定默認(rèn)值。調(diào)用時(shí)可以不給出參數(shù),而按指定的默認(rèn)值進(jìn)行工作。fun(1);fun(1,0); fun(1,1);第23頁/共77頁注意:1.可以全部或部分參數(shù)定義為帶默認(rèn)值,但帶默認(rèn)值的參數(shù)只能放在參數(shù)表的最后。 (從右至左逐漸定義) 因?yàn)橄到y(tǒng)進(jìn)行參數(shù)匹配時(shí)是依照從前往后(從左往右)的順序,如果中間參數(shù)有默認(rèn)值,它就無法判斷哪些參數(shù)使用默認(rèn)值。f(5);f(3,6);f(2,3,4);例:以下函數(shù)定義不正確: void f ( int p1=1,int p2,int p3=3 ) void f ( int p1=1,int p2=2,int p3 ) void f (

14、 int p1, int p2=2, int p3)第24頁/共77頁2.函數(shù)又有定義,又有說明時(shí),一般在說明中給出默認(rèn)形參值。void f (int x, int y=0);void main()void f (int x, int y)第25頁/共77頁3.程序還可以通過重新定義函數(shù)原型使本來不帶默認(rèn)值的參數(shù)帶上默認(rèn)值,這是使通用函數(shù)特定化的有效方法但在同一作用域中,函數(shù)的某一參數(shù)的默認(rèn)值只能說明一次。void f( int x, int y=0 ); void f( int x=1, int y ); /合法 void f (int x, int y=1); /不可 void main(

15、) void f (int x, int y=1);/可以 void f (int x, int y) 第26頁/共77頁#include void f(int x,int y=0);void f(int x=1,int y);void main( ) f( ); f(0); f(1,1);void f(int x,int y) cout “x=” x “,”;cout “y=” y endl;本程序的運(yùn)行結(jié)果如下 x=1,y=0 x=0,y=0 x=1,y=1第27頁/共77頁4.4 作用域 作用域(討論標(biāo)識(shí)符的有效范圍) 變量的作用域是指程序中變量有效的區(qū)域。 變量的作用域分為三類:文件域

16、、局部域和類域。變量定義位置有效范圍文件域 程序文件中除函數(shù)和程序文件中除函數(shù)和類定義以外的部分類定義以外的部分從說明開始到文件結(jié)從說明開始到文件結(jié)束束局部域 塊內(nèi)。(函數(shù),或復(fù)塊內(nèi)。(函數(shù),或復(fù)合語句內(nèi)部)合語句內(nèi)部)從定義到塊結(jié)束。從定義到塊結(jié)束。(函數(shù)或復(fù)合語句)(函數(shù)或復(fù)合語句)類域類內(nèi)。(類屬性)類內(nèi)。(類屬性)類內(nèi)類內(nèi)第28頁/共77頁#includeint global; void f(int par)int flocal;if (global) int blocal; blocal=par; blocal=1; flocal=1; global=1; void main() i

17、nt local=2; f(local);全局變量 全局域定義的變量(定義在所有函數(shù)之外的變量)局部變量 函數(shù)、塊中定義的變量global/全局變量localparflocalblocal局部變量第29頁/共77頁global作用域flocal作用域blocal作用域local作用域#incledeint global; /全局變量void f(int par)int flocal;if (global) int blocal; blocal=par; blocal=1; flocal=1; global=1; void main() int local=2; f(local);第30頁/共7

18、7頁 同一作用域,不能聲明同名的標(biāo)志符 在沒有互相包含關(guān)系的作用域中,聲明的標(biāo)志符互不影響 具有包含關(guān)系的作用域中聲明了同名標(biāo)志符,則外層標(biāo)志符在內(nèi)層不可見第31頁/共77頁#include int n=1; /n為全局變量void Fun() int n=10; / n為函數(shù)內(nèi)局部變量 cout “Fun:n=” n 0) int n=5; /n為塊內(nèi)局部變量 cout “Block:n=”n endl; cout “Main:n= ”n endl; /n為全局變量Fun:n=10Block:n=5Main:n=2第32頁/共77頁在同一作用域中,函數(shù)的某一參數(shù)的默認(rèn)值只能說明一次。void

19、 initialize(int printNO, int state=0);void initialize(int printNO, int state=1);/不可void main()void initialize(int printNO, int state=1);/可以void initialize(int printNO, int state)第33頁/共77頁struct stu;void f()stu s1;void main()stu s2;void f()struct stu;stu s1;void main()stu s2;/?第34頁/共77頁4.4.1 永久變量、臨時(shí)變

20、量和靜態(tài)變量變量的存儲(chǔ)空間與生命期變量的存儲(chǔ)空間可以是永久的(即在程序運(yùn)行期間該變量一直存在)也可以是暫時(shí)的(即變量在程序運(yùn)行到達(dá)其定義處時(shí)才會(huì)產(chǎn)生,而作用域結(jié)束時(shí),變量也隨之消亡)全局變量是永久的,它們?cè)诔绦蜻\(yùn)行的過程中一直存在;而局部變量大多是臨時(shí)的,它們只在說明它們的作用域內(nèi)發(fā)揮作用,一旦程序控制離開了這一作用域,這些局部變量所占空間就會(huì)釋放。第35頁/共77頁靜態(tài)變量(static) 靜態(tài)局部變量 聲明方式:在局部變量定義前加上static標(biāo)記。 static int local; 既有在局部域作用的特性,又可以永久存在。 系統(tǒng)給靜態(tài)的局部變量分配固定的存儲(chǔ)空間,而不是每次執(zhí)行到該局部

21、域時(shí)才分配空間,所以它能一直保持值。 靜態(tài)局部變量只在第一次執(zhí)行時(shí)初始化一次,一般的局部變量每次執(zhí)行到該局部域都需要初始化。第36頁/共77頁int add()static int sum=0;sum+;return sum;void main()for(int j=0;j10;j+)coutadd()endl;第37頁/共77頁例49 給出以下程序的執(zhí)行結(jié)果:#includeint global1=0; /全局變量可以在程序中顯式初始化int global2; /全局變量也可以由系統(tǒng)隱式初始化為0static int global3=1 ; /靜態(tài)全局變量void main()int i ;

22、 /局部臨時(shí)變量for(i=0;i3;i+) int temp=l; /局部臨時(shí)變量,每次循環(huán)都會(huì)重新初始化 static int perm=l; /靜態(tài)局部變量,只在第一次初始化 cout “temp=” temp “,perm=”perm endl; +temp; +permtemp=1,perm=1temp=1,perm=2temp=1,perm=3第38頁/共77頁 靜態(tài)全局變量 全局變量也可以是靜態(tài)的。 靜態(tài)全局變量的含義完全不同于靜態(tài)局部變量:被定義為靜態(tài)的全局變量只在定義它的文件中可見,其他文件中不能使用。 靜態(tài)全局變量有兩個(gè)好處: 一是信息隱藏, 二是可以在不同的文件中使用意義

23、不同而同名的變量名。第39頁/共77頁4.4.2 域運(yùn)算符 局部變量可以隱藏全局變量,那么在有同名全局和局部變量的情形時(shí)如何訪問全局變量呢? 域運(yùn)算符“:”可以提供對(duì)全局變量的訪問。以域運(yùn)算符為前綴的變量表示全局變量。int var=10 ; /全局變量func() int var; /局部變量 var=: var; /將全局變量的值賦給局部變量第40頁/共77頁4.4.3.外部變量(extern) 外部變量說明extern標(biāo)識(shí): extern int var; 和變量相同,定義在一個(gè)文件中的函數(shù)也可以由另一個(gè)文件引用:extern void func(int,int);定義文件1中的全局變量

24、可以由另一個(gè)文件(文件2)引用,但需要在文件2中說明一下所要引用的變量,該變量對(duì)于文件2來說是外部變量。注:如果在說明外部變量時(shí)不能給變量賦初值第41頁/共77頁# i n c l u d e void f() int b; b=a*2; /錯(cuò)誤 printf(%dn,b);int a=100; main() f(); a+; f();#include void f() int b; extern int a; b=a*2; printf(%dn,b); int a=100; main() f(); a+; f(); 在f 內(nèi)部增加 extern i n t a ; 將全局變量a的作用 域擴(kuò)展

25、到函數(shù)f的內(nèi)部。第42頁/共77頁/* p1.c */#include int a10=0;void main()/* p2.c */#include extern int a10; /也可以這樣寫:extern int a ;void getdata() int k; for(k=0;k10;k+) scanf(%d,&ak); 第43頁/共77頁4.4.4.自動(dòng)變量(auto)和寄存器變量(register)1、自動(dòng)變量 說明加上關(guān)鍵字auto: auto int n; 函數(shù)內(nèi)沒說明存儲(chǔ)類型的變量都是auto的,只是省略了auto。 一般用自動(dòng)存儲(chǔ)類型說明的變量都限制在某個(gè)程序范圍

26、內(nèi)使用,即為局部變量(包括函數(shù)形參)。 當(dāng)程序執(zhí)行到超出該變量的作用域時(shí),就釋放他所占用的內(nèi)存空間,其值也隨之消失了。第44頁/共77頁2、寄存器變量 使用關(guān)鍵字register說明。 寄存器類型的變量的目的是將說明的變量放入寄存器內(nèi),從而加快了程序的運(yùn)行速度。 但有時(shí)在使用這種說明時(shí),若系統(tǒng)寄存器已經(jīng)被其它數(shù)據(jù)占用,寄存器類型的變量就會(huì)自動(dòng)當(dāng)作auto變量。 第45頁/共77頁堆區(qū) (動(dòng)態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))全局?jǐn)?shù)據(jù)區(qū) (全局變量、靜態(tài)變量)代碼區(qū) (程序代碼)操作系統(tǒng)為一個(gè)C+C+程序的運(yùn)行所分配的內(nèi)存分為四個(gè)區(qū)域,如圖程序在內(nèi)存中的區(qū)域所示:C+的內(nèi)存布局代碼區(qū):存放程序代碼全局?jǐn)?shù)

27、據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù),區(qū)分配時(shí)全部?jī)?nèi)存清0棧區(qū):存放程序中的局部變量,區(qū)分配時(shí)不處理堆區(qū):存放與指針相關(guān)的動(dòng)態(tài)數(shù)據(jù),區(qū)分配時(shí)不處理第46頁/共77頁靜態(tài)生命期指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí)存在,即具有存儲(chǔ)空間,到程序運(yùn)行結(jié)束時(shí)消亡,即釋放存儲(chǔ)空間。具有靜態(tài)生命期的標(biāo)識(shí)符存放在全局?jǐn)?shù)據(jù)區(qū),如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標(biāo)識(shí)符在未被用戶初始化的情況下,系統(tǒng)會(huì)自動(dòng)將其初始化為0 0。 函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。變量的生命期第47頁/共77頁局部生命期在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命期,其生命期開始于執(zhí)

28、行到該函數(shù)或塊的標(biāo)識(shí)符聲明處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有局部生命期的標(biāo)識(shí)符存放在棧區(qū)。具有局部生命期的標(biāo)識(shí)符如果未被初始化,其內(nèi)容是隨機(jī)的。 具有局部生命期的標(biāo)識(shí)符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。第48頁/共77頁動(dòng)態(tài)生命期具有動(dòng)態(tài)生命期的標(biāo)識(shí)符由特定的函數(shù)調(diào)用或運(yùn)算來創(chuàng)建和釋放,如調(diào)用malloc()malloc()或用newnew運(yùn)算符為變量分配存儲(chǔ)空間時(shí),變量的生命期開始,而調(diào)用free()free()或用deletedelete運(yùn)算符釋放空間或程序結(jié)束時(shí),變量生命期結(jié)束。具有動(dòng)態(tài)生命期的變量存放在堆區(qū)。具有動(dòng)態(tài)生命期的標(biāo)識(shí)符如果未被初

29、始化,其內(nèi)容是隨機(jī)的。(關(guān)于newnew運(yùn)算和deletedelete運(yùn)算將在后面章節(jié)介紹) 第49頁/共77頁自動(dòng)自動(dòng)變量變量靜態(tài)變量靜態(tài)變量 局部局部 全局全局寄存器寄存器變量變量外部變量外部變量(全局變量)(全局變量)程序結(jié)束前程序結(jié)束前一直保存;一直保存;(生命期)(生命期)多個(gè)函數(shù)共多個(gè)函數(shù)共享;(作用享;(作用域)域)初始化;初始化; 否否 否否不定不定有有 有有否否 可以可以 0 0 無無 否否不定不定 有有 可以可以 0變量的存儲(chǔ)類型:變量定義時(shí)可以加上關(guān)鍵字,標(biāo)識(shí)變量的存儲(chǔ)類型,系統(tǒng)根據(jù)其定義分配釋放存儲(chǔ)空間。存儲(chǔ)類型關(guān)鍵字 類型名 變量名表;第50頁/共77頁45 內(nèi)聯(lián)函數(shù)

30、 內(nèi)聯(lián)(inline)是內(nèi)聯(lián)擴(kuò)展(inline expansion)的簡(jiǎn)稱。 為什么引入內(nèi)聯(lián)函數(shù)? 在編譯時(shí),C十十編譯器在遇到調(diào)用內(nèi)聯(lián)函數(shù)的地方會(huì)用函數(shù)體中的代碼來替換函數(shù)的調(diào)用 好處:節(jié)省函數(shù)調(diào)用帶來的參數(shù)傳遞、運(yùn)行棧的入棧與出棧等開銷,從而提高運(yùn)行速度。 代價(jià):增加了代碼長(zhǎng)度。第51頁/共77頁一般函數(shù)調(diào)用機(jī)制main( ).調(diào)func().保存:返回地址當(dāng)前現(xiàn)場(chǎng)恢復(fù):主調(diào)函數(shù)現(xiàn)場(chǎng)返回地址void func( ).第52頁/共77頁定義:在一般函數(shù)定義前加inline關(guān)鍵字。inline int abs(int x) if (x0) return x; else return x;voi

31、d main( ) int m,m1=2,n,n1=-10; m=abs(m1); n=abs(n1); 編譯程序會(huì)自動(dòng)用函數(shù)體代替函數(shù)調(diào)用void main() int m,mt=2,n,n1=-10; / m=abs(m1);轉(zhuǎn)換代碼 if(m10) m=-m1; else m=m1; /n=abs(n1);轉(zhuǎn)換代碼 If (nl=1):”);scanf(“%d”,&n);h=f(n);printf(“%d!=%ld”,n,h);第56頁/共77頁例2:梵塔問題設(shè)3根柱子A、B、C,n個(gè)盤片盤片從A柱搬到C柱構(gòu)造遞歸關(guān)系:f(n,a,b,c):移動(dòng)n個(gè)盤片,從a借助b到cf(n,a

32、,b,c)與f(n-1, )的遞歸關(guān)系?f(n-1,a,c,b)move(a,c)f(n-1,b,a,c)void move(char m,char n)printf(“%c%c”,m,n);void f( int n,char a,char b,char c)if(n=1)move(a,c);return;f(n-1,a,c,b);move(a,c);f(n-1,b,a,c);void main()f(3,A,B,C);第57頁/共77頁4.7 函數(shù)重載 所謂函數(shù)重載是指同一個(gè)函數(shù)名可以對(duì)應(yīng)多個(gè)函數(shù)的實(shí)現(xiàn)。 作用: 如何區(qū)分? 函數(shù)重載要求編譯器能夠惟一地確定調(diào)用一個(gè)函數(shù)時(shí)應(yīng)執(zhí)行哪個(gè)函數(shù)代碼

33、,確定函數(shù)實(shí)現(xiàn)時(shí),要求從函數(shù)參數(shù)的個(gè)數(shù)和類型上來區(qū)分。 這就是說,進(jìn)行函數(shù)重載時(shí),要求同名函數(shù)在參數(shù)個(gè)數(shù)上不同,或者參數(shù)類型上不同。否則,將無法實(shí)現(xiàn)重載。第58頁/共77頁#include int add(int x,int y)return x+y;double add (double x,double y)return x+y;complex add(complex c1,complex c2)complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;struct complexdoubl

34、e real;double imaginary;第59頁/共77頁void main()int m=10, n=11;double x=1.1, y=1.2;cout add(m,n) endl;cout add(x,y) endl;/complex c1,c2,c3;c1.real=1.0;c1.imaginary=2.0;c2.real=3.0;c2.imaginary=4.0;c3=add(c1,c2);cout c3.real “” c2.imaginary “i”; 根據(jù)實(shí)參類型選擇函數(shù)第60頁/共77頁#include int min(int a,int b) return ab

35、? a: b;int min(int a,int b,int c) int t=min(a,b); return min(t,c);int min (int a,int b,int c,int d) int t=min(a,b,c); return min(t,d); void main() cout min(13,5,4,9) endl; cout min(-2,8,0)(b) ? (a) : (b) )其中(a,b)是宏MAX的參數(shù)表如果在程序中出現(xiàn)語句 x=MAX(3,9);則預(yù)處理后變成 x=(39 ? 3:9); /結(jié)果為9很顯然,帶參數(shù)的宏相當(dāng)于一個(gè)函數(shù)的功能,但比函數(shù)要簡(jiǎn)潔。第66頁/共77頁4.8.2 文件包含命令 所謂“文件包含”是指將另一個(gè)源文件的內(nèi)容合并到當(dāng)前源程序中。 C+語言提供#include命令用來實(shí)現(xiàn): #include #include ”文件名”格式一:用來包含那些由系統(tǒng)提供的并放在指定子目錄中的頭文件。格式二:用來包含那些由用戶自己定義的放在當(dāng)前目錄或其他目錄下的文件。 includ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論