第4章函數(shù)和預處理_第1頁
第4章函數(shù)和預處理_第2頁
第4章函數(shù)和預處理_第3頁
第4章函數(shù)和預處理_第4頁
第4章函數(shù)和預處理_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章函數(shù)和預處理 4.1 函數(shù)的概述函數(shù)的概述 4.2 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用 4.3 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞 4.4 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) 4.5 遞歸函數(shù)遞歸函數(shù) 4.6 函數(shù)重載函數(shù)重載 4.7 作用域作用域 4.8 文件與預處理文件與預處理4.1函數(shù)概述 所謂函數(shù)就是一系列指令或語句的所謂函數(shù)就是一系列指令或語句的組合體,它有兩個目的:組合體,它有兩個目的: 功能分解功能分解 復用復用4.2 函數(shù)定義和調(diào)用在使用函數(shù)時,要先對函數(shù)進行定義定義,確定它要實現(xiàn)的功能。函數(shù)的使用就是調(diào)用函數(shù)調(diào)用函數(shù)的過程。4.2.1 函數(shù)定義 任何函數(shù)都由函數(shù)說明和函數(shù)體兩部分 形式如下:形式

2、如下: ()函數(shù)體函數(shù)體;函數(shù)名函數(shù)名是一個有效是一個有效c+標識符,標識符,其后面必須其后面必須跟一對圓括跟一對圓括號(),以號(),以區(qū)別于變量區(qū)別于變量名及其他用名及其他用戶定義的標戶定義的標識名。識名。函數(shù)類型函數(shù)類型即函數(shù)的返回即函數(shù)的返回值的類型,值的類型,如如果不需要函數(shù)果不需要函數(shù)有返回值有返回值,則,則只要定義函數(shù)只要定義函數(shù)的類型為的類型為void即可。即可。形式參數(shù)表形式參數(shù)表寫在括號中寫在括號中,各參數(shù)以逗號各參數(shù)以逗號隔開,每個參隔開,每個參數(shù)由參數(shù)類型數(shù)由參數(shù)類型和參數(shù)名表示。和參數(shù)名表示。參數(shù)個數(shù)可以參數(shù)個數(shù)可以為,但圓括為,但圓括號不能省略。號不能省略。函數(shù)體函

3、數(shù)體由由在一對花括號在一對花括號中的若干條語中的若干條語句組成,句組成,用于用于實現(xiàn)這個函數(shù)實現(xiàn)這個函數(shù)執(zhí)行的功能。執(zhí)行的功能。注:注:c+不允許在一個函不允許在一個函數(shù)體中再定義另一個函數(shù)數(shù)體中再定義另一個函數(shù)輸入兩整數(shù)輸入兩整數(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

4、;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(-);coutendl;coutsetw(10)m1*m2endl;函數(shù)調(diào)用函數(shù)調(diào)用主調(diào)函數(shù)主調(diào)函數(shù)main()f();f();被調(diào)函數(shù)被調(diào)函數(shù)f()void f( )for(int i=0;i10;i+)cout(-);coutendl;函數(shù)名();函數(shù)名();void mainint m1,m2,sum;cou

5、t輸入兩整數(shù): m1m2;coutsetw(10)m1endl;cout+setw(9)m2endl; f();coutsetw(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;函數(shù)的參數(shù) 函數(shù)可以有參數(shù)函數(shù)可以有參數(shù) 函數(shù)定義時,定義形式參數(shù)表:函數(shù)定義時,定義形式參數(shù)表:類型類型1 參數(shù)變量名參數(shù)變量名1,類型,類型2 參數(shù)變量名參數(shù)變量名2 函數(shù)調(diào)用時傳入實

6、際參數(shù)函數(shù)調(diào)用時傳入實際參數(shù): 數(shù)值數(shù)值1,數(shù)值,數(shù)值2 實參可以是:常量、變量、表達式實參可以是:常量、變量、表達式 實參要求:與形參個數(shù)相同,順序?qū)?,類型相容實參要求:與形參個數(shù)相同,順序?qū)?,類型相容void f(char c, int count)int i;for(i=0;icount;i+)coutc;coutb)max=a;elsemax=b;return max;例:寫一個函數(shù),求兩個例:寫一個函數(shù),求兩個數(shù)的最大值數(shù)的最大值void main()int m,n,x;cinmn;x=max(m,n);cout“較大值較大值”xy)return x; return y; 函數(shù)返

7、回值語法:return 表達式; 將return后面的值作為函數(shù)返回值,并將程序控制返回到調(diào)用此函數(shù)的位置處。 若函數(shù)類型為void,函數(shù)體中就不需要return語句或者return的后面什么也沒有。一旦執(zhí)行return語句,函數(shù)體return后面的語句就不在執(zhí)行void f (int n)if(n0)return;4.2.2函數(shù)的說明 函數(shù)必須先定義后調(diào)用函數(shù)必須先定義后調(diào)用 若函數(shù)定義在后而調(diào)用在前,需要在調(diào)用前進行若函數(shù)定義在后而調(diào)用在前,需要在調(diào)用前進行“函數(shù)的說明函數(shù)的說明”。 說明一個函數(shù)的格式如下說明一個函數(shù)的格式如下函數(shù)類型函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表);函數(shù)名(函數(shù)參數(shù)表);

8、其中,形參的變量名可以其中,形參的變量名可以省略。但要注意,函數(shù)說省略。但要注意,函數(shù)說明的內(nèi)容應與函數(shù)的定義明的內(nèi)容應與函數(shù)的定義相同。相同。例:例:int max(int x,int y);int max(int,int);函數(shù)原型函數(shù)原型4.2.3 函數(shù)調(diào)用 調(diào)用函數(shù)的一般形式如下:調(diào)用函數(shù)的一般形式如下: 函數(shù)名(實際參數(shù)表)函數(shù)名(實際參數(shù)表) 實際參數(shù)實際參數(shù)與與形參形參相對應,它是實際調(diào)用函數(shù)相對應,它是實際調(diào)用函數(shù)時所給定的常量,變量或表達式。時所給定的常量,變量或表達式。 一般地,一般地,僅當函數(shù)被調(diào)用時,系統(tǒng)才會給形僅當函數(shù)被調(diào)用時,系統(tǒng)才會給形參分配內(nèi)存單元參分配內(nèi)存單元

9、,而調(diào)用結(jié)束后,形參所占,而調(diào)用結(jié)束后,形參所占用的內(nèi)存單元又被釋放。用的內(nèi)存單元又被釋放。 例:例: 輸入兩個實數(shù),輸出其中較大的數(shù)。其中求兩個實數(shù)中的較輸入兩個實數(shù),輸出其中較大的數(shù)。其中求兩個實數(shù)中的較大數(shù)用函數(shù)完成。大數(shù)用函數(shù)完成。#includefloat max(float , float );void main()float a, b;cout輸入兩個實數(shù):輸入兩個實數(shù):ab;couta和和b中較大數(shù)為中較大數(shù)為max(a, b) =y?x:y);main( )函函數(shù)數(shù)調(diào)用調(diào)用max(2.5,4.7 )函數(shù)函數(shù)max(2.5,4.7 )return 4.7 主程序后續(xù)主程序后續(xù)語

10、句語句注意:注意:實參與形參的個數(shù)應該相等,類型應一致,且按順序?qū)崊⑴c形參的個數(shù)應該相等,類型應一致,且按順序一一對應傳遞數(shù)據(jù)。一一對應傳遞數(shù)據(jù)。在在c+中,調(diào)用一個函數(shù)的方式可以有很多,例如:中,調(diào)用一個函數(shù)的方式可以有很多,例如:1. 作為一個語句不使用返回值作為一個語句不使用返回值max(3,4); 2. 作為表達式的一部分作為表達式的一部分int c=5*max(2,10); 3. 作為函數(shù)的實參作為函數(shù)的實參int c=0;c=max(max(c,4),10); 4.3函數(shù)的參數(shù)傳遞 參數(shù)類型檢查參數(shù)類型檢查 c+參數(shù)的傳遞方式:一種為參數(shù)的傳遞方式:一種為按值傳遞按值傳遞,另一另一

11、種為種為地址或引用傳遞。地址或引用傳遞。1.按值傳遞 按值傳遞按值傳遞 參數(shù)傳遞的缺省初始化方式是把實參的值拷貝到參數(shù)傳遞的缺省初始化方式是把實參的值拷貝到形參的存儲區(qū)。形參的存儲區(qū)。 函數(shù)本身不對實參進行操作,只是處理的實參的函數(shù)本身不對實參進行操作,只是處理的實參的本地拷貝。也就是說,即使形參的值在函數(shù)中發(fā)本地拷貝。也就是說,即使形參的值在函數(shù)中發(fā)生了變化,實參的值不會受到影響。生了變化,實參的值不會受到影響。#includefloat max(float ,float );void main()float a,b;cout輸入兩個實數(shù):輸入兩個實數(shù):ab;coutx和和y中較大數(shù)為中較大

12、數(shù)為max(a,b) = y ? x : y );xyab#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;運行結(jié)果:運行結(jié)果:a=2,b=10該函數(shù)的參數(shù)是按值傳遞該函數(shù)的參數(shù)是按值傳遞的,不對實參產(chǎn)生影響。的,不對實參產(chǎn)生影響。如果想要實參值改變,不如果想要實參值改變,不能用傳值方法。能用傳值方法。形參及形參及變量局變量局部有效部有效2. 地址傳遞 是指在函數(shù)定義時是指在函數(shù)定義時將形參說明成指針。將形參

13、說明成指針。 調(diào)用函數(shù)時就需要指定調(diào)用函數(shù)時就需要指定地址值形式的實參。地址值形式的實參。 地址傳遞方式的特點是可以通過改變形參地址傳遞方式的特點是可以通過改變形參(指針指針)所指向的變量來影響實參。)所指向的變量來影響實參。#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é)果如本程序執(zhí)行結(jié)果如下:下:a=10 b=2這說明通過這說明通過指針變指針變量的形參可以實現(xiàn)量的形參可以實現(xiàn)函數(shù)的地

14、址傳遞函數(shù)的地址傳遞(有關(guān)指針內(nèi)容將在(有關(guān)指針內(nèi)容將在第五章介紹)。第五章介紹)。3.引用傳遞 引用類型引用類型 引用是給已知變量起一個別名引用是給已知變量起一個別名 當建立引用時,程序用另一個變量的名字來對其進當建立引用時,程序用另一個變量的名字來對其進行初始化。行初始化。 引用的聲明形式:引用的聲明形式: &引用名引用名=變量名變量名 對引用的操作實際是對其引用的變量的操作對引用的操作實際是對其引用的變量的操作int a,b=10;int &i=a;i=5; i=b;引用在聲明時必須初始化引用在聲明時必須初始化引用一旦聲明引用一旦聲明,就不能再成為其他變量的別就不能再成為其他變量的別名名

15、引用與被引用的變量指向同一內(nèi)存地址。引用與被引用的變量指向同一內(nèi)存地址。a,i例如:例如:void swap(int & x, int & y) 按引用傳遞按引用傳遞 在函數(shù)定義時將形參前面加上引用運算符在函數(shù)定義時將形參前面加上引用運算符“&”。 實參傳遞為同類型的變量。形參成為實參的實參傳遞為同類型的變量。形參成為實參的引用。引用。 形參的任何操作都會改變相應的實參的數(shù)據(jù)。形參的任何操作都會改變相應的實參的數(shù)據(jù)。#includevoid swap(int &x,int &y) int temp=x; x=y; y=temp;void main()int a=2,b=10;swap(a,b)

16、; cout ”a=” a “,b=” b endl;本程序執(zhí)行結(jié)果如下:本程序執(zhí)行結(jié)果如下:a=10 b=2函數(shù)函數(shù)swap中的中的int &x和和int &y就是形參的引用就是形參的引用說明。說明。使用引用的目的在于使用引用的目的在于 需要改變函數(shù)的實參值需要改變函數(shù)的實參值 大類型對象做函數(shù)參數(shù)大類型對象做函數(shù)參數(shù) 當一個函數(shù)返回一個引用時,它可以成為左當一個函數(shù)返回一個引用時,它可以成為左值。值。4.3.4 函數(shù)的默認參數(shù)值 在在c+中,允許在函數(shù)的說明或定義時給一中,允許在函數(shù)的說明或定義時給一個或多個參數(shù)指定默認值。調(diào)用時可以不給個或多個參數(shù)指定默認值。調(diào)用時可以不給出參數(shù),而按指

17、定的默認值進行工作出參數(shù),而按指定的默認值進行工作。fun(1);fun(1,0); fun(1,1);注意:注意:1. 可以可以全部全部或或部分部分參數(shù)定義為帶默認值,但參數(shù)定義為帶默認值,但帶默認值的參數(shù)只能放在參數(shù)表的帶默認值的參數(shù)只能放在參數(shù)表的最后最后。 (從右至左逐漸定義)(從右至左逐漸定義) 因為因為系統(tǒng)進行參數(shù)匹配時是依照從前往后系統(tǒng)進行參數(shù)匹配時是依照從前往后(從左往右)的順序,(從左往右)的順序,如果中間參數(shù)有默認值,如果中間參數(shù)有默認值,它就無法判斷哪些參數(shù)使用默認值。它就無法判斷哪些參數(shù)使用默認值。f(5);f(3,6);f(2,3,4);例例:以下函數(shù)定義以下函數(shù)定義

18、不正確不正確: void f ( int p1=1,int p2,int p3=3 ) void f ( int p1=1,int p2=2,int p3 ) void f ( int p1, int p2=2, int p3)2. 函數(shù)又有定義,又有說明時,一般在說函數(shù)又有定義,又有說明時,一般在說明中給出默認形參值。明中給出默認形參值。void f (int x, int y=0);void main()void f (int x, int y)3.程序還可以程序還可以通過重新定義函數(shù)原型使本來不帶默認值通過重新定義函數(shù)原型使本來不帶默認值的參數(shù)帶上默認值的參數(shù)帶上默認值,這是使通用函數(shù)特

19、定化的有效方,這是使通用函數(shù)特定化的有效方法法但在同一作用域中,函數(shù)的某一參數(shù)的默認值只能說但在同一作用域中,函數(shù)的某一參數(shù)的默認值只能說明一次。明一次。void f( int x, int y=0 ); void f( int x=1, int y ); /合法合法 void f (int x, int y=1); /不可不可 void main() void f (int x, int y=1);/可以可以 void f (int x, int y) #include void f(int x,int y=0);void f(int x=1,int y);void main( ) f( )

20、; f(0); f(1,1);void f(int x,int y) cout “x=” x “,”;cout “y=” y endl;本程序的運行結(jié)果如下本程序的運行結(jié)果如下 x=1,y=0 x=0,y=0 x=1,y=14.4 作用域 作用域(討論標識符的有效范圍)作用域(討論標識符的有效范圍) 變量的作用域是變量的作用域是指程序中變量有效的區(qū)域指程序中變量有效的區(qū)域。 變量的作用域分為三類:變量的作用域分為三類:文件域、局部域和類域文件域、局部域和類域。變量定義位置有效范圍文件域 程序文件中除函數(shù)和程序文件中除函數(shù)和類定義以外的部分類定義以外的部分從說明開始到文件結(jié)從說明開始到文件結(jié)束束

21、局部域 塊內(nèi)。(函數(shù),或復塊內(nèi)。(函數(shù),或復合語句內(nèi)部)合語句內(nèi)部)從定義到塊結(jié)束。從定義到塊結(jié)束。(函數(shù)或復合語句)(函數(shù)或復合語句)類域類內(nèi)。(類屬性)類內(nèi)。(類屬性)類內(nèi)類內(nèi)#includeint 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);全局變量全局變量 全局域定義的變量全局域定義的變量(定義在所有函數(shù)(定義在所有函數(shù)之外的變量)之外的變量)局部變量局部變量 函數(shù)

22、、塊中定義的函數(shù)、塊中定義的變量變量global/全局變量全局變量localparflocalblocal局部變量局部變量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); 同一作用域,不能聲明同名的標志符同一作用域,不能聲明同名的標志符 在沒有互相包

23、含關(guān)系的作用域中,聲明的標在沒有互相包含關(guān)系的作用域中,聲明的標志符互不影響志符互不影響 具有包含關(guān)系的作用域中聲明了同名標志符,具有包含關(guān)系的作用域中聲明了同名標志符,則外層標志符在內(nèi)層不可見則外層標志符在內(nèi)層不可見#include int n=1; /n為全局變量為全局變量void fun() int n=10; / n為函數(shù)內(nèi)局部變量為函數(shù)內(nèi)局部變量 cout “fun:n=” n 0) int n=5; /n為塊內(nèi)局部變量為塊內(nèi)局部變量 cout “block:n=”n endl; cout “main:n= ”n endl; /n為全局變量為全局變量fun:n=10block:n=5

24、main:n=2在同一作用域中,函數(shù)的某一參數(shù)的默認在同一作用域中,函數(shù)的某一參數(shù)的默認值只能說明一次。值只能說明一次。void 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)struct stu;void f()stu s1;void main()stu s2;void f()st

25、ruct stu;stu s1;void main()stu s2;/?4.4.1 永久變量、臨時變量和靜態(tài)變量變量的存儲空間與生命期變量的存儲空間與生命期變量的存儲空間變量的存儲空間可以是可以是永久永久的(即在的(即在程序運行期間該變量一程序運行期間該變量一直存在)直存在)也可以是也可以是暫時暫時的(即的(即變量在程序運行到達其變量在程序運行到達其定義處時才會產(chǎn)生,而定義處時才會產(chǎn)生,而作用域結(jié)束時,變量也作用域結(jié)束時,變量也隨之消亡)隨之消亡)全局變量是永久全局變量是永久的,它們在程序的,它們在程序運行的過程中一直存在;運行的過程中一直存在;而而局部變量大多是臨時局部變量大多是臨時的,它們

26、的,它們只在說明它們的作用域內(nèi)發(fā)揮作只在說明它們的作用域內(nèi)發(fā)揮作用,一旦程序控制離開了這一作用,一旦程序控制離開了這一作用域,這些局部變量所占空間就用域,這些局部變量所占空間就會釋放。會釋放。靜態(tài)變量(static) 靜態(tài)局部變量靜態(tài)局部變量 聲明方式:在局部變量定義前加上聲明方式:在局部變量定義前加上static標記。標記。 static int local; 既有在局部域作用的特性,又可以永久存在。既有在局部域作用的特性,又可以永久存在。 系統(tǒng)給靜態(tài)的局部變量分配固定的存儲空間,而系統(tǒng)給靜態(tài)的局部變量分配固定的存儲空間,而不是每次執(zhí)行到該局部域時才分配空間,所以它不是每次執(zhí)行到該局部域時才

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

28、系統(tǒng)隱式初始化為全局變量也可以由系統(tǒng)隱式初始化為0static int global3=1 ; /靜態(tài)全局變量靜態(tài)全局變量void main()int i ; /局部臨時變量局部臨時變量for(i=0;i3;i+) int temp=l; /局部臨時變量,每次循環(huán)都會重新初始化局部臨時變量,每次循環(huán)都會重新初始化 static int perm=l; /靜態(tài)局部變量,只在第一次初始化靜態(tài)局部變量,只在第一次初始化 cout “temp=” temp “,perm=”perm endl; +temp; +permtemp=1,perm=1temp=1,perm=2temp=1,perm=3 靜態(tài)

29、全局變量靜態(tài)全局變量 全局變量全局變量也可以是也可以是靜態(tài)靜態(tài)的的。 靜態(tài)全局變量的含義完全不同于靜態(tài)局部變量:靜態(tài)全局變量的含義完全不同于靜態(tài)局部變量:被定義為靜態(tài)的全局變量被定義為靜態(tài)的全局變量只在定義它的文件中可只在定義它的文件中可見,其他文件中不能使用見,其他文件中不能使用。 靜態(tài)全局變量有兩個好處:靜態(tài)全局變量有兩個好處: 一是一是信息隱藏信息隱藏, 二是可以二是可以在不同的文件中使用意義不同而同名的變量在不同的文件中使用意義不同而同名的變量名。名。4.4.2 域運算符 局部變量可以局部變量可以隱藏全局變量隱藏全局變量,那么在有同名全局和,那么在有同名全局和局部變量的情形時如何訪問全

30、局變量呢局部變量的情形時如何訪問全局變量呢? 域運算符域運算符“:”可以可以提供對全局變量的訪問提供對全局變量的訪問。以。以域運算符為前綴的變量表示全局變量。域運算符為前綴的變量表示全局變量。int var=10 ; /全局變量全局變量func() int var; /局部變量局部變量 var=: var; /將全局變量的值賦給局部變量將全局變量的值賦給局部變量4.4.3.外部變量(extern) 外部變量說明外部變量說明extern標識:標識: extern int var; 和變量相同,定義在一個文件中的函數(shù)也可和變量相同,定義在一個文件中的函數(shù)也可以由另一個文件引用:以由另一個文件引用:

31、extern void func(int,int);定義文件定義文件1中的中的全局變量全局變量可以由另一個文件可以由另一個文件(文件文件2)引用,但需引用,但需要在文件要在文件2中說明一下所要引用的變量,該變量對于文件中說明一下所要引用的變量,該變量對于文件2來說來說是外部變量。是外部變量。注:如果在說明外部變量時不能給變量賦初值注:如果在說明外部變量時不能給變量賦初值# i n c l u d e void f() int b; b=a*2; /錯誤錯誤 printf(%dn,b);int a=100; main() f(); a+; f();#include void f() int b;

32、 extern int a; b=a*2; printf(%dn,b); int a=100; main() f(); a+; f(); 在在f內(nèi)部增內(nèi)部增加加 extern i n t a ; 將全局變量將全局變量a的作用域的作用域擴展到函數(shù)擴展到函數(shù)f的內(nèi)部。的內(nèi)部。/* 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); 4.4.4.自

33、動變量自動變量(auto)和寄存器變量(和寄存器變量(register)1、自動變量、自動變量 說明加上關(guān)鍵字說明加上關(guān)鍵字auto: auto int n; 函數(shù)內(nèi)沒說明存儲類型的變量都是函數(shù)內(nèi)沒說明存儲類型的變量都是auto的,只是省的,只是省略了略了auto。 一般用一般用自動存儲類型自動存儲類型說明的變量都限制在某個程序說明的變量都限制在某個程序范圍內(nèi)使用,即為范圍內(nèi)使用,即為局部變量(包括函數(shù)形參)局部變量(包括函數(shù)形參)。 當程序執(zhí)行到超出該變量的作用域時,就釋放他所當程序執(zhí)行到超出該變量的作用域時,就釋放他所占用的內(nèi)存空間,其值也隨之消失了。占用的內(nèi)存空間,其值也隨之消失了。2、

34、寄存器變量、寄存器變量 使用關(guān)鍵字使用關(guān)鍵字register說明。說明。 寄存器類型的變量的目的是寄存器類型的變量的目的是將說明的變量將說明的變量放入寄存器內(nèi)放入寄存器內(nèi),從而,從而加快了程序的運行速加快了程序的運行速度。度。 但有時在使用這種說明時,若但有時在使用這種說明時,若系統(tǒng)寄存器系統(tǒng)寄存器已經(jīng)被其它數(shù)據(jù)占用,寄存器類型的變量已經(jīng)被其它數(shù)據(jù)占用,寄存器類型的變量就會自動當作就會自動當作auto變量。變量。 堆區(qū)堆區(qū) (動態(tài)數(shù)據(jù)動態(tài)數(shù)據(jù))棧區(qū)棧區(qū)(函數(shù)局部數(shù)據(jù))(函數(shù)局部數(shù)據(jù))全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū) (全局變量、靜態(tài)變量全局變量、靜態(tài)變量)代碼區(qū)代碼區(qū) (程序代碼)(程序代碼)操作系統(tǒng)為一

35、個操作系統(tǒng)為一個c+c+程序的運行所分配的內(nèi)存分為四程序的運行所分配的內(nèi)存分為四個區(qū)域,如圖程序在內(nèi)存中的區(qū)域所示:個區(qū)域,如圖程序在內(nèi)存中的區(qū)域所示:c+的內(nèi)存布局代碼區(qū)代碼區(qū):存放程序代碼:存放程序代碼全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū):存放程序的:存放程序的全局數(shù)據(jù)和靜態(tài)數(shù)據(jù),區(qū)全局數(shù)據(jù)和靜態(tài)數(shù)據(jù),區(qū)分配時全部內(nèi)存清分配時全部內(nèi)存清0棧區(qū)棧區(qū):存放程序中的局部:存放程序中的局部變量,區(qū)分配時不處理變量,區(qū)分配時不處理堆區(qū)堆區(qū):存放與指針相關(guān)的:存放與指針相關(guān)的動態(tài)數(shù)據(jù),區(qū)分配時不處動態(tài)數(shù)據(jù),區(qū)分配時不處理理靜態(tài)生命期靜態(tài)生命期指的是標識符從程序開始運行時存在,即具有存儲指的是標識符從程序開始運行時存在

36、,即具有存儲空間,到程序運行結(jié)束時消亡,即釋放存儲空間??臻g,到程序運行結(jié)束時消亡,即釋放存儲空間。具有靜態(tài)生命期的標識符存放在具有靜態(tài)生命期的標識符存放在全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū),如全,如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標識符在未被用戶初始化的情況具有靜態(tài)生命期的標識符在未被用戶初始化的情況下,系統(tǒng)會下,系統(tǒng)會自動將其初始化為自動將其初始化為0 0。 函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有有文件作用域文件作用域的標識符都具有靜態(tài)生命期。的標識符都具有靜態(tài)生命期。變量的生命期局部生命期局部生命

37、期在在函數(shù)內(nèi)部函數(shù)內(nèi)部或或塊塊中定義的標識符具有局部生命期,中定義的標識符具有局部生命期,其生命期開始于執(zhí)行到該函數(shù)或塊的標識符聲明處,其生命期開始于執(zhí)行到該函數(shù)或塊的標識符聲明處,結(jié)束于該函數(shù)或塊的結(jié)束處。結(jié)束于該函數(shù)或塊的結(jié)束處。具有局部生命期的標識符存放在具有局部生命期的標識符存放在棧區(qū)棧區(qū)。具有局部生。具有局部生命期的標識符如果未被初始化,其命期的標識符如果未被初始化,其內(nèi)容是隨機的內(nèi)容是隨機的。 具有局部生命期的標識符必定具有局部作用域;具有局部生命期的標識符必定具有局部作用域;但反之不然,但反之不然,靜態(tài)局部變量具有局部作用域,但卻靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。具

38、有靜態(tài)生命期。動態(tài)生命期動態(tài)生命期具有動態(tài)生命期的標識符具有動態(tài)生命期的標識符由特定的函數(shù)調(diào)用或運算由特定的函數(shù)調(diào)用或運算來創(chuàng)建和釋放來創(chuàng)建和釋放,如調(diào)用,如調(diào)用mallocmalloc()()或用或用newnew運算符為變運算符為變量分配存儲空間時,變量的生命期開始,而調(diào)用量分配存儲空間時,變量的生命期開始,而調(diào)用free()free()或用或用deletedelete運算符釋放空間或程序結(jié)束時,變運算符釋放空間或程序結(jié)束時,變量生命期結(jié)束。量生命期結(jié)束。具有動態(tài)生命期的變量存放在具有動態(tài)生命期的變量存放在堆區(qū)堆區(qū)。具有動態(tài)生命期的標識符如果未被初始化,其具有動態(tài)生命期的標識符如果未被初始化

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

40、儲空間。的存儲類型,系統(tǒng)根據(jù)其定義分配釋放存儲空間。存儲類型關(guān)鍵字存儲類型關(guān)鍵字 類型名類型名 變量名表;變量名表;45 內(nèi)聯(lián)函數(shù) 內(nèi)聯(lián)內(nèi)聯(lián)(inline)是是內(nèi)聯(lián)擴展內(nèi)聯(lián)擴展(inline expansion)的簡稱。的簡稱。 為什么引入內(nèi)聯(lián)函數(shù)?為什么引入內(nèi)聯(lián)函數(shù)? 在編譯時,在編譯時,c十十編譯器在遇到調(diào)用內(nèi)聯(lián)函十十編譯器在遇到調(diào)用內(nèi)聯(lián)函數(shù)的地方會數(shù)的地方會用函數(shù)體中的代碼來替換函數(shù)的用函數(shù)體中的代碼來替換函數(shù)的調(diào)用調(diào)用 好處:好處:節(jié)省節(jié)省函數(shù)調(diào)用帶來的參數(shù)傳遞、運行函數(shù)調(diào)用帶來的參數(shù)傳遞、運行棧的入棧與出棧等棧的入棧與出棧等開銷開銷,從而提高運行速度。從而提高運行速度。 代價:代價:

41、增加了代碼長度增加了代碼長度。一般函數(shù)調(diào)用機制main( ).調(diào)調(diào)func().保存:返回地址保存:返回地址當前現(xiàn)場當前現(xiàn)場恢復:主調(diào)函數(shù)現(xiàn)場恢復:主調(diào)函數(shù)現(xiàn)場返回地址返回地址void func( ).定義定義:在一般函數(shù)定義前加在一般函數(shù)定義前加inline關(guān)鍵字。關(guān)鍵字。inline int abs(int x) if (x0) return x; else return x;void main( ) int m,m1=2,n,n1=-10; m=abs(m1); n=abs(n1); 編譯程序會自動用函數(shù)編譯程序會自動用函數(shù)體代替函數(shù)調(diào)用體代替函數(shù)調(diào)用void main() int m,

42、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);例2:梵塔問題設設3根柱子根柱子a、b、c,n個盤片個盤片盤片從盤片從a柱搬到柱搬到c柱柱構(gòu)造遞歸關(guān)系:構(gòu)造遞歸關(guān)系:f(n,a,b,c):移動:移動n個盤片,個盤片,從從a借助借助b到到cf(n,a,b,c)與與f(n-1, )的遞歸的遞歸關(guān)系?關(guān)系?f(n-1,a,c,b)move(a,c)f(n-1,b,a,c)void move

43、(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);4.7 函數(shù)重載 所謂所謂函數(shù)重載函數(shù)重載是指是指同一個函數(shù)名可以對應多同一個函數(shù)名可以對應多個函數(shù)的實現(xiàn)。個函數(shù)的實現(xiàn)。 作用:作用: 如何區(qū)分?如何區(qū)分? 函數(shù)重載要求編譯器能夠惟一地確定調(diào)用一個函函數(shù)重載要求編譯器能夠惟一地確定調(diào)用一個函數(shù)時應執(zhí)行哪個函數(shù)代碼數(shù)時應執(zhí)行哪個函數(shù)代碼,確定函數(shù)

44、實現(xiàn)時,要,確定函數(shù)實現(xiàn)時,要求從函數(shù)參數(shù)的求從函數(shù)參數(shù)的個數(shù)個數(shù)和和類型類型上來區(qū)分。上來區(qū)分。 這就是說,進行函數(shù)重載時,要求這就是說,進行函數(shù)重載時,要求同名同名函數(shù)在參數(shù)個數(shù)上不同,或者參數(shù)類型函數(shù)在參數(shù)個數(shù)上不同,或者參數(shù)類型上不同上不同。否則,將無法實現(xiàn)重載。否則,將無法實現(xiàn)重載。#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.ima

45、ginary=c1.imaginary+c2.imaginary;return c;struct complexdouble real;double imaginary;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ù)實參類型根

46、據(jù)實參類型選擇函數(shù)選擇函數(shù)#include int min(int a,int b) return ab ? 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ù)表的參數(shù)表如果在程序中出現(xiàn)語句如果在程序中出

47、現(xiàn)語句 x=max(3,9);則預處理后變成則預處理后變成 x=(39 ? 3:9); /結(jié)果為結(jié)果為9很顯然,很顯然,帶參數(shù)的宏相當于一個函數(shù)的功能,但比帶參數(shù)的宏相當于一個函數(shù)的功能,但比函數(shù)要簡潔函數(shù)要簡潔。4.8.2 文件包含命令 所謂所謂“文件包含文件包含”是指是指將另一個源文件的內(nèi)容將另一個源文件的內(nèi)容合并到當前源程序中。合并到當前源程序中。 c+語言提供語言提供#include命令用來實現(xiàn):命令用來實現(xiàn): #include #include ”文件名文件名”格式一:用來包含那些由格式一:用來包含那些由系統(tǒng)系統(tǒng)提供的并放在提供的并放在指指定子目錄定子目錄中的中的頭文件頭文件。格式二:用來包含那些由格式二:用來包含那些由用戶

溫馨提示

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

評論

0/150

提交評論