函數(shù)的遞歸調(diào)用重載默認(rèn)參數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第1頁
函數(shù)的遞歸調(diào)用重載默認(rèn)參數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第2頁
函數(shù)的遞歸調(diào)用重載默認(rèn)參數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第3頁
函數(shù)的遞歸調(diào)用重載默認(rèn)參數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第4頁
函數(shù)的遞歸調(diào)用重載默認(rèn)參數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì)第3章(2) 函數(shù)遞歸調(diào)用、重載、默認(rèn)參數(shù)1第1頁主要內(nèi)容函數(shù)遞歸調(diào)用遞歸函數(shù)執(zhí)行過程函數(shù)重載重載函數(shù)注意事項(xiàng)帶默認(rèn)值形參內(nèi)聯(lián)函數(shù)程序多文件結(jié)構(gòu)編譯預(yù)處理2第2頁函數(shù)遞歸調(diào)用函數(shù)遞歸調(diào)用: 直接遞歸調(diào)用:指在一個(gè)函數(shù)A定義中,出現(xiàn)了調(diào)用本身A情況,這種調(diào)用關(guān)系稱為直接遞歸調(diào)用,而函數(shù)A就是遞歸函數(shù)。 間接遞歸調(diào)用:指在一個(gè)函數(shù)A定義中,調(diào)用了函數(shù)B,而在函數(shù)B定義中又調(diào)用了函數(shù)A,這種調(diào)用關(guān)系稱為間接遞歸調(diào)用,而函數(shù)A也是遞歸函數(shù)。 遞歸算法關(guān)鍵在于: 確立遞歸公式 分析遞歸結(jié)束條件遞歸函數(shù)設(shè)計(jì)普通方法: 先判斷遞歸結(jié)束條件 再進(jìn)行遞歸調(diào)用3第3頁【例】(用遞歸算法求 n! 。 )

2、 分析:確立遞歸公式: n! = n (n-1)! 分析遞歸結(jié)束條件:當(dāng) n=0或n=1 時(shí), n!值為1。 # include # include int fun ( int n ) /函數(shù)fun()功效是:求n! if ( n=0 | n=1) return 1 ; /先判斷遞歸結(jié)束條件 return ( n * fun( n-1 ) ) ; /再進(jìn)行遞歸調(diào)用void main ( ) int n ; cout n ; if ( n0 ) cout “輸入數(shù)據(jù)有錯(cuò)!” ; exit(0) ; cout n “! = ” fun( n ) endl ; 運(yùn)行:請(qǐng)輸入一個(gè)正整數(shù):3 3! =

3、64第4頁 main()函數(shù)調(diào)用 fun(3) 時(shí)執(zhí)行過程:main()函數(shù)調(diào)用 fun(3) 時(shí)棧中改變情況:局部變量:n=3執(zhí)行:cout fun(3)main()函數(shù)形參變量:n=3執(zhí)行:return 3 * fun(2)fun(3)函數(shù)形參變量:n=2執(zhí)行:return 2 * fun(1)fun(2)函數(shù)形參變量:n=1執(zhí)行:return 1 fun(1)函數(shù)遞推遞推遞推回歸回歸回歸3操作系統(tǒng)執(zhí)行狀態(tài)和返回地址main()局部變量n3操作系統(tǒng)執(zhí)行狀態(tài)和返回地址main()局部變量n3main()函數(shù)執(zhí)行狀態(tài)和返回地址fun(3)形參變量n3操作系統(tǒng)執(zhí)行狀態(tài)和返回地址main()局部變

4、量n3main()函數(shù)執(zhí)行狀態(tài)和返回地址fun(3)形參變量n2fun(3)函數(shù)執(zhí)行狀態(tài)和返回地址fun(2)形參變量n3操作系統(tǒng)執(zhí)行狀態(tài)和返回地址main()局部變量n3main()函數(shù)執(zhí)行狀態(tài)和返回地址fun(3)形參變量n2fun(3)函數(shù)執(zhí)行狀態(tài)和返回地址fun(2)形參變量n1fun(2)函數(shù)執(zhí)行狀態(tài)和返回地址fun(1)形參變量n5第5頁遞歸函數(shù)執(zhí)行過程遞歸函數(shù)執(zhí)行過程: 遞歸函數(shù)執(zhí)行過程比較復(fù)雜,往往都存在著連續(xù)遞歸調(diào)用,其執(zhí)行過程可分為 “遞推” 和 “回歸” 兩個(gè)階段,先是一次一次不停遞推過程,直到符合遞歸結(jié)束條件,然后是一層一層回歸過程。 而其中每一次遞歸調(diào)用,系統(tǒng)都要在棧

5、中分配空間以保留該次調(diào)用返回地址、參數(shù)、局部變量,所以在遞推階段,??臻g一直處于增加狀態(tài),直到碰到遞歸結(jié)束條件,然后進(jìn)入回歸階段,??臻g反向依次釋放。 在遞歸執(zhí)行過程中,遞歸結(jié)束條件非常主要,它控制 “遞推” 過程終止,所以在任何一個(gè)遞歸函數(shù)中,遞歸結(jié)束條件都是必不可少,不然將會(huì)一直 “遞推” 下去。造成無窮遞歸。遞歸算法缺點(diǎn):內(nèi)存消耗巨大,且連續(xù)地調(diào)用和返回操作占用較多CPU時(shí)間。遞歸算法優(yōu)點(diǎn):算法描述簡(jiǎn)練易懂。6第6頁【例】(分析下面遞歸函數(shù)執(zhí)行過程,并給出程序運(yùn)行結(jié)果。 )# include void sub ( char c ) cout c ; if ( c=a ) return ;

6、 sub ( c-1 ) ; cout c ; return ;void main ( ) char ch = e ; sub ( ch ) ; 運(yùn)行:e d c b a b c d e局部變量:ch=e執(zhí)行: sub( e )main()函數(shù)形參變量:c=e執(zhí)行: cout c; sub( e-1 ) cout c returnsub( e )函數(shù)形參變量:c=d執(zhí)行: cout c; sub( d-1 ) cout c returnsub( d )函數(shù)遞推回歸遞推回歸形參變量:c=b執(zhí)行: cout c; sub( b-1 ) cout c returnsub( b )函數(shù)形參變量:c=a

7、執(zhí)行: cout c; if (c=a) returnsub( a )函數(shù)遞推回歸形參變量:c=c執(zhí)行: cout c; sub( c-1 ) cout c returnsub( c )函數(shù)遞推回歸遞推回歸7第7頁【例】(用遞歸算法計(jì)算從n個(gè)人中選擇k個(gè)人組成一個(gè)委員會(huì)不一樣組合數(shù)。 ) 分析:確立遞歸公式:由 n 人中選 k 人組合數(shù) = 由 n-1 人中選 k 人組合數(shù) + 由 n-1 人中選 k-1 人組合數(shù) 分析遞歸結(jié)束條件:當(dāng) n=k 或 k=0 時(shí),組合數(shù)為1。# include # include int comm ( int n , int k ) /函數(shù)comm()功效是:求

8、n人中選k人組合數(shù) if ( nk ) return 0 ; if ( n=k | k=0 ) return 1 ; /先判斷遞歸結(jié)束條件 return ( comm( n-1, k ) + comm( n-1, k-1 ) ) ; /再進(jìn)行遞歸調(diào)用void main ( ) int n , k ; cout n k ; if ( n=0 | k=0 ) cout “輸入數(shù)據(jù)有錯(cuò)!” ; exit(0) ; cout “由” n “人中選” k “人組合數(shù) = ” comm( n, k ) endl ; 運(yùn)行:請(qǐng)輸入正整數(shù) n 和 k:8 5 由8人中選5人組合數(shù) = 56 8第8頁【例】(漢

9、諾塔問題:有 A、B、C 三根柱子,A柱上有n個(gè)大小不等盤子,大盤在下,小盤在上。要求將這n個(gè)盤子從A柱移動(dòng)到C柱,在移動(dòng)過程中能夠借助A、B、C 中任何一根柱子,但每次只允許移動(dòng)一個(gè)盤子,且在移動(dòng)過程中三根柱子上都必須保持大盤在下,小盤在上。)分析:將n個(gè)盤子從A柱移動(dòng)到C柱可分解為以下三個(gè)步驟: 將A 柱上n-1個(gè)盤子移動(dòng)到 B柱(借助C柱) 將A柱上剩下一個(gè)盤子移動(dòng)到C柱上 將n-1個(gè)盤子從B柱上移動(dòng)到C柱上(借助A柱)分析得到,以上三個(gè)步驟包含兩種操作:將若干個(gè)盤子從一根柱上移動(dòng)到另一根柱上,用遞歸函數(shù) hanoi() 實(shí)現(xiàn)。將1個(gè)盤子從一根柱上移動(dòng)到另一根柱上,用函數(shù) move()

10、實(shí)現(xiàn)。A柱B柱C柱9第9頁# include void move ( char get , char put ) /函數(shù)move()功效是:將一個(gè)盤子從 get柱上移動(dòng)到 put柱上 cout get “柱 ” put “柱” endl ; void hanoi ( int n , char one , char two , char three ) /函數(shù)hanoi()功效是:將n 個(gè)盤子從one柱移動(dòng)到three柱(借助two柱) if ( n=1 ) move ( one , three ) ; return ; /先判斷遞歸結(jié)束條件 else hanoi ( n-1 , one , t

11、hree , two ) ; /將one柱上n-1個(gè)盤子移動(dòng)到two柱(借助three柱), 進(jìn)行遞歸調(diào)用 move ( one , three ) ; /將one柱上剩下一個(gè)盤子移動(dòng)到three柱上 hanoi ( n-1 , two , one , three ) ; /將two柱上n-1個(gè)盤子移動(dòng)到three柱(借助one柱), 進(jìn)行遞歸調(diào)用 10第10頁void main ( ) int n ; cout n ; cout “將” n “個(gè)盤子從A柱移動(dòng)到C柱步驟:” endl ; hanoi ( n , A , B , C ) ; 運(yùn)行:請(qǐng)輸入盤子數(shù):4 將4個(gè)盤子從A柱移動(dòng)到C柱步

12、驟: A柱 B柱 A柱 C柱 B柱 C柱 A柱 B柱 C柱 A柱 C柱 B柱 A柱 B柱 A柱 C柱 B柱 C柱 B柱 A柱 C柱 A柱 B柱 C柱 A柱 B柱 A柱 C柱 B柱 C柱11第11頁函數(shù)重載函數(shù)重載: 重載含義:就是重新賦予新含義。在C+一個(gè)程序中能夠用同一個(gè)函數(shù)名來命名多個(gè)函數(shù),這些同名函數(shù)在參數(shù)個(gè)數(shù)、類型上一定有所不一樣,分別代表不一樣函數(shù),當(dāng)同名多個(gè)函數(shù)出現(xiàn)在同一個(gè)作用域內(nèi)時(shí),稱為重載函數(shù)。 重載目標(biāo):程序中經(jīng)常將功效相近函數(shù)在相同作用域內(nèi)以相同函數(shù)名命名,從而形成重載函數(shù),目標(biāo)是方便使用,便于記憶?!纠?int add ( int x , int y ) ; float

13、 add ( float x , float y ) ; float add ( double x , double y ) ; int add ( int x , int y ) ; int add ( int x , int y , int z ) ; int add ( int x , int y , int z , int w ) ;函數(shù)名相同,但參數(shù)類型不一樣 函數(shù)名相同,但參數(shù)個(gè)數(shù)不一樣12第12頁重載函數(shù)注意事項(xiàng)注意事項(xiàng): 重載函數(shù)形參必須有所不一樣:參數(shù)個(gè)數(shù)或參數(shù)類型不一樣。 編譯系統(tǒng)是依據(jù)實(shí)參加形參在類型及個(gè)數(shù)上最正確匹配來選擇調(diào)用哪一個(gè)函數(shù)。 【例】 定義重載函數(shù)時(shí),要防止

14、二義性,以免編譯系統(tǒng)無法確定到底調(diào)用哪一個(gè)函數(shù)。【例】 int add ( int x , int y ) ;int add ( int a , int b ) ;編譯器不以形參名來區(qū)分。int add ( int x , int y ) ;void add ( int x , int y ) ;編譯器不以返回值來區(qū)分。int add ( int x , int y ) ;int add ( char a , char b ) ;當(dāng)調(diào)用 add ( 200 , A ) 時(shí),編譯器無法確定到底調(diào)用哪一個(gè)函數(shù)。13第13頁【例】# include int add ( int x , int y )

15、 /重載函數(shù) cout “正在進(jìn)行:兩個(gè) int 型數(shù)據(jù)相加!tt” ; return ( x + y ) ; float add ( float x , float y ) /重載函數(shù) cout “正在進(jìn)行:兩個(gè) float 型數(shù)據(jù)相加!tt” ; return ( x + y ) ; double add ( double x , double y ) /重載函數(shù) cout “正在進(jìn)行:兩個(gè) double 型數(shù)據(jù)相加!tt” ; return ( x + y ) ; void main ( ) int a1 = 5 , b1 = 8 ; float a2 = 5.1 , b2 = 8.1

16、; double a3 = 5.2 , b3 = 8.2 ; cout add ( a1 , b1 ) endl ; cout add ( a2 , b2 ) endl ; cout add ( a3 , b3 ) endl ; cout add ( 2 , 4 ) endl ; cout add ( 2.1 , 4.1 ) endl ; cout add ( A , 2 ) endl ; 運(yùn)行:正在進(jìn)行:兩個(gè) int 型數(shù)據(jù)相加! 13正在進(jìn)行:兩個(gè) float 型數(shù)據(jù)相加! 13.2正在進(jìn)行:兩個(gè) double 型數(shù)據(jù)相加! 13.4正在進(jìn)行:兩個(gè) int 型數(shù)據(jù)相加! 6正在進(jìn)行:兩個(gè)

17、double 型數(shù)據(jù)相加! 6.2正在進(jìn)行:兩個(gè) int 型數(shù)據(jù)相加! 11514第14頁帶默認(rèn)值形參默認(rèn)形參值作用:函數(shù)申明時(shí)能夠給形參指定一個(gè)默認(rèn)值,調(diào)用時(shí)若給出實(shí)參,則形參采取實(shí)參值,若沒有給出對(duì)應(yīng)實(shí)參,則該形參采取預(yù)先給出默認(rèn)值。【例】# include int add ( int x = 10 , int y = 20 ) /帶默認(rèn)形參值函數(shù) cout “正在進(jìn)行:” x “ + ” y “ = ” ; return ( x + y ) ; void main ( ) cout add ( 30 , 40 ) endl ; cout add ( 50 ) endl ; cout ad

18、d ( ) endl ; cout add ( 2 , 4 ) endl ; cout add ( A , 1 ) endl ; cout add ( A ) endl ; 運(yùn)行:正在進(jìn)行:30 + 40 = 70正在進(jìn)行:50 + 20 = 70正在進(jìn)行:10 + 20 = 30正在進(jìn)行:50 + 4 = 54正在進(jìn)行:65 + 49 = 114正在進(jìn)行:65 + 20 = 8515第15頁帶默認(rèn)值形參帶默認(rèn)值形參申明次序:函數(shù)必須按從右往左次序逐一申明帶默認(rèn)值形參,且在帶默認(rèn)值形參右面不能出現(xiàn)不帶默認(rèn)值形參。只有這么要求后,在函數(shù)調(diào)用時(shí)才不會(huì)產(chǎn)生二義性?!纠?int add ( int

19、x , int y=2 , int z=3 ) ;當(dāng)程序中調(diào)用 add ( 10 ) 時(shí),編譯器調(diào)用 add ( 10 , 2 , 3 ) 。當(dāng)程序中調(diào)用 add ( 10 , 20 ) 時(shí),編譯器調(diào)用 add ( 10 , 20 , 3 ) 。int add ( int x=1 , int y , int z=3 ) ;當(dāng)程序中調(diào)用 add ( 10 , 20 ) 時(shí),編譯器無法確定調(diào)用以下那一個(gè): add ( 10 , 20 , 3 ) 或 add ( 1 , 10 , 20 ) int add ( int x=1 , int y=2 , int z=3 ) ;當(dāng)程序中調(diào)用 add ( )

20、 時(shí),編譯器調(diào)用 add ( 1 , 2 , 3 ) 。當(dāng)程序中調(diào)用 add ( 10 ) 時(shí),編譯器調(diào)用 add ( 10 , 2 , 3 ) 。當(dāng)程序中調(diào)用 add ( 10 , 20 ) 時(shí),編譯器調(diào)用 add ( 10 , 20 , 3 ) 。16第16頁帶默認(rèn)值形參默認(rèn)形參值僅能申明一次:若函數(shù)定義在前、調(diào)用在后,默認(rèn)形參值在函數(shù)定義時(shí)申明;若函數(shù)調(diào)用在前、定義在后,默認(rèn)形參值必須在函數(shù)原型申明中給出,且在之后該函數(shù)定義時(shí),不能再重復(fù)指定默認(rèn)形參值。【例】# include int add ( int x = 1 , int y = 2 ) ; /帶默認(rèn)形參值函數(shù)原型申明void m

21、ain ( ) cout add ( 3 , 4 ) endl ; cout add ( 5 ) endl ; cout add ( ) endl ; int add ( int x , int y ) /函數(shù)定義性申明 cout “正在進(jìn)行:” x “ + ” y “ = ” ; return ( x + y ) ;運(yùn)行:正在進(jìn)行:3 + 4 = 7正在進(jìn)行:5 + 2 = 7正在進(jìn)行:1 + 2 = 317第17頁帶默認(rèn)值形參默認(rèn)形參值作用域:同一個(gè)函數(shù)在相同作用域內(nèi),默認(rèn)形參值應(yīng)保持唯一,但在不一樣作用域內(nèi),可提供不一樣默認(rèn)形參值?!纠? include int add ( int x

22、 = 1 , int y = 2 ) ; /函數(shù)add()全局原型申明void main ( ) int add ( int x = 3 , int y = 4 ) ; /函數(shù)add()局部原型申明 void fun ( ) ; /函數(shù)fun()原型申明 cout add( ) endl ; /使用局部默認(rèn)形參值(實(shí)現(xiàn)3+4) fun( ) ; void fun ( ) /函數(shù)fun()定義性申明 cout add( ) endl ; /使用全局默認(rèn)形參值(實(shí)現(xiàn)1+2) cout add( 10 ) endl ; int add ( int x , int y ) /函數(shù)add()定義性申明

23、cout “正在進(jìn)行:” x “ + ” y “ = ” ; return ( x + y ) ; 運(yùn)行:正在進(jìn)行:3 + 4 = 7正在進(jìn)行:1 + 2 = 3正在進(jìn)行:10 + 2 = 1218第18頁內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù): 含義:函數(shù)申明時(shí)前面加上 inline 為內(nèi)聯(lián)函數(shù),含義是向編譯系統(tǒng)提議:編譯時(shí)在調(diào)用處用函數(shù)體進(jìn)行置換,以節(jié)約了函數(shù)調(diào)用時(shí)控制轉(zhuǎn)移、參數(shù)傳遞等開銷。 實(shí)質(zhì):是使用空間換取時(shí)間方法,以加速程序執(zhí)行,當(dāng)出現(xiàn)屢次調(diào)用同一個(gè)內(nèi)聯(lián)函數(shù)時(shí),程序本身占用空間有所增加,若內(nèi)聯(lián)函數(shù)僅調(diào)用一次時(shí),并不增加程序本身占用存放空間。 注意:對(duì)于用戶指定內(nèi)聯(lián)函數(shù),編譯器是否作為內(nèi)聯(lián)函數(shù)來處理由編譯

24、器自行決定。另外內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán) 、switch 等復(fù)雜結(jié)構(gòu)控制語句?!纠? include inline float area ( float r ) /內(nèi)聯(lián)函數(shù) return ( 3.1415 * r * r ) ; void main ( ) cout “半徑 = ” 3 “n面積 = ” area ( 3 ) endl ; cout “半徑 = ” 5 “n面積 = ” area ( 5 ) endl ; 運(yùn)行:半徑 = 3面積 = 28.2735半徑 = 5面積 = 78.537519第19頁程序多文件結(jié)構(gòu)多文件程序: 在C+中,一個(gè)較大程序通常被分解為若干個(gè)源程序文件,然后

25、分別對(duì)各個(gè)源程序文件單獨(dú)進(jìn)行編譯,這些源程序文件由一個(gè)工程文件進(jìn)行管理,最終連接成一個(gè)完整程序。 在多文件組成程序中,一個(gè)源程序文件中定義全局變量或函數(shù),在另外一個(gè)源程序文件中被引用前,必須先對(duì)該全局變量或函數(shù)作外部申明。 外部類型變量申明格式: extern 類型 全局變量名 ; 外部類型函數(shù)申明格式: extern 函數(shù)原型申明 ; 若一個(gè)源程序文件中定義全局變量或函數(shù),僅限于該源程序文件中使用,不能被程序中其它源程序文件使用,在定義該全局變量或函數(shù)時(shí)前面需加上static。 內(nèi)部類型變量申明格式: static 類型 全局變量名 ; 內(nèi)部類型函數(shù)申明格式: static 函數(shù)原型申明 ;

26、20第20頁【例】(本程序由兩個(gè)文件組成:c1.cpp、c2.cpp )/文件c1.cpp內(nèi)容# include int a = 5 ; /定義a為普通全局變量,可拓展到外部文件使用static int b = 8 ; /定義b為靜態(tài)全局變量,只能在本文件中使用extern int f0 ( int x ) ; /函數(shù)f0() 外部申明,其定義部分在 c2.cpp 中int f1 ( int x , int y ) /函數(shù)f1() 定義性申明,可拓展到外部文件使用 cout “進(jìn)入函數(shù) f1() 了!t” ; return ( x + y + a + b ) ;extern int f2 (

27、int x ) ; /函數(shù)f2() 外部申明,其定義部分在 c2.cpp 中extern int f3 ( ) ; /函數(shù)f3() 外部申明,其定義部分在 c2.cpp 中extern int f4 ( int x , int y ) ; /函數(shù)f4() 外部申明,其定義部分在 c2.cpp 中void main ( ) /cout f0 ( 7 ) endl ; /此句編譯經(jīng)過,但連接犯錯(cuò),f0()僅能在c2.cpp中使用 cout f1 ( 1 , 2 ) endl ; cout f2 ( 3 ) endl ; cout f3 ( ) endl ; cout f4 ( 5 , 6 ) en

28、dl ;運(yùn)行:進(jìn)入函數(shù) f1() 了! 16進(jìn)入函數(shù) f2() 了! 15進(jìn)入函數(shù) f3() 了! 進(jìn)入函數(shù) f0() 了! 216進(jìn)入函數(shù) f4() 了! 18021第21頁/文件c2.cpp內(nèi)容# include extern int a ; /全局變量a 外部申明,其定義部分在 c1.cpp 中extern int b ; /全局變量b 外部申明,其定義部分在 c1.cpp 中static int f0 ( int x ) /函數(shù)f0() 定義性申明,只能在本文件中使用 cout “進(jìn)入函數(shù) f0() 了!t” ; return ( x * x ) ;int f2 ( int x ) /

29、函數(shù)f2() 定義性申明,可拓展到外部文件使用 cout “進(jìn)入函數(shù) f2() 了!t” ; / b+ ; /此句編譯經(jīng)過,但連接犯錯(cuò),b僅能在 c1.cpp 中使用 return ( x * a ) ; int f3 ( ) /函數(shù)f3() 定義性申明,可拓展到外部文件使用 cout “進(jìn)入函數(shù) f3() 了!t” ; return ( f0( +a ) * a ) ; int f4 ( int x , int y ) /函數(shù)f4() 定義性申明,可拓展到外部文件使用 cout “進(jìn)入函數(shù) f4() 了!t” ; return ( x * y * a ) ; 22第22頁編譯預(yù)處理編譯預(yù)處理

30、: 指源程序文件在被編譯之前,由編譯預(yù)處理程序?qū)ζ渌黾庸ぬ幚砉ぷ鳌?編譯預(yù)處理程序不是C+編譯程序組成部分。 編譯預(yù)處理程序在處理源程序文件時(shí),是將預(yù)處理好程序?qū)懭氲揭粋€(gè)暫時(shí)文件中,并將該暫時(shí)文件作為編譯程序輸入文件,即編譯程序是對(duì)該暫時(shí)文件進(jìn)行編譯,產(chǎn)生目標(biāo)文件。 編譯預(yù)處理不會(huì)影響源程序文件中內(nèi)容。編譯預(yù)處理命令:一律以 # 開頭,以回車符結(jié)束,末尾不加分號(hào),且單獨(dú)占用一行。編譯預(yù)處理命令通常放在源程序文件開始部分。編譯預(yù)處理命令有三種: 包含文件 宏定義 條件編譯23第23頁編譯預(yù)處理 #include 命令包含文件: 格式1: # include 格式2: # include “ 文

31、件名 ” 處理過程:將命令中所指定文件內(nèi)容嵌入到當(dāng)前源程序文件該 #include 命令處,成為當(dāng)前源程序文件一個(gè)組成部分。 # include :表示按標(biāo)準(zhǔn)方式查找,即從C+系統(tǒng)目錄下include子目錄中開始查找所要包含文件。C+庫函數(shù)普通都存放在編譯器約定include子目錄下,當(dāng)需要使用庫函數(shù)時(shí)通常采取該格式。 # include “文件名” :表示先從當(dāng)前目錄(即當(dāng)前源程序文件所在目錄)開始查找所要包含文件,若找不到,再按標(biāo)準(zhǔn)方式查找,到C+系統(tǒng)目錄下include子目錄中繼續(xù)查找。當(dāng)需要包含用戶自定義文件時(shí),通常采取該格式。 # include “帶路徑文件名” :若所要包含文件既

32、不在include子目錄中,也不在當(dāng)前目錄中,必須指明文件路徑。例: # include “ E:ABC123file1 ” 24第24頁編譯預(yù)處理 #define 命令不帶參數(shù)宏定義: 格式1: # define 宏名 格式2: # define 宏名 宏體 處理過程:定義一個(gè)宏名,若宏名后面跟有宏體,則將其后程序中全部出現(xiàn)該宏名地方用對(duì)應(yīng)宏體替換之,這種替換過程稱為“宏替換”或“宏展開”。幾點(diǎn)說明: 宏名是一個(gè)標(biāo)識(shí)符,通慣用大寫字母表示,方便與程序中變量名區(qū)分。 宏定義能夠出現(xiàn)在程序中任何位置,宏名作用域是從定義處開始到文件結(jié)尾處結(jié)束。若要提前終止宏名作用域,可使用預(yù)處理命令: # und

33、ef 宏名 在同一個(gè)作用域內(nèi),同一個(gè)宏名不允許定義兩次或兩次以上,不然編譯預(yù)處理在進(jìn)行宏替換時(shí),會(huì)出現(xiàn)二義性。 在一個(gè)宏定義中能夠使用前面已定義過宏名。25第25頁編譯預(yù)處理 #define 命令 宏替換時(shí),只對(duì)宏名做簡(jiǎn)單替換,不做任何計(jì)算,也不做任何語法檢驗(yàn),若宏定義時(shí)書寫不正確,會(huì)得到不正確結(jié)果或編譯時(shí)出現(xiàn)語法錯(cuò)誤。 當(dāng)宏名出現(xiàn)在字符串中時(shí),編譯預(yù)處理不進(jìn)行宏替換?!纠?#include # define A 3+5# define B A*A /替換后: #define B 3+5*3+5# define C (A)*(A) /替換后: #define C (3+5)*(3+5)# d

34、efine D “A” # define E “輸出:t” void main ( ) cout E “B南C京A” endl ; /替換后: cout “輸出:t” “B南C京A” endl ; cout E A endl ; /替換后: cout “輸出:t” 3+5 endl ; cout E B endl ; /替換后: cout “輸出:t” 3+5*3+5 endl ; cout E C endl ; /替換后: cout “輸出:t” (3+5)*(3+5) endl ; cout E D endl ; /替換后: cout “輸出:t” “A” endl ; 運(yùn)行:輸出: B南

35、C京A輸出: 8輸出: 23輸出: 64輸出: A26第26頁編譯預(yù)處理 #define 命令帶參數(shù)宏定義: 格式: # define 宏名( 形參表 ) 宏體 形參表由若干個(gè)參數(shù)名組成,參數(shù)之間以逗號(hào)分隔。 宏體由若干個(gè)參數(shù)組成一個(gè)式子。 處理過程:類似于函數(shù)處理過程,先將宏調(diào)用中實(shí)參替換宏定義中形參,即先進(jìn)行參數(shù)替換,再進(jìn)行宏替換。幾點(diǎn)說明: 宏名是一個(gè)標(biāo)識(shí)符,與后面形參表左括號(hào)之間不得有空格。 所謂參數(shù)替換,是指用宏調(diào)用中每一個(gè)實(shí)參字符序列去替換宏定義中對(duì)應(yīng)形參,且只做簡(jiǎn)單替換,不做任何計(jì)算 。 一個(gè)宏定義應(yīng)在一行內(nèi)定義完,以換行符結(jié)束,若多于一行在行尾加上轉(zhuǎn)義符“”。27第27頁【例】

36、 #include # define PRINT( a ) cout “a = ” a endl ; # define print( a , b ) cout “ab = ” a * b endl ; cout “ab = ” a / b endl ; void main ( ) int x , y ; cout x y ; PRINT( x ) /替換后:cout “a = ” x endl ; PRINT( y ) /替換后:cout “a = ” y endl ; PRINT( x+y ) /替換后:cout “a = ” x+y endl ; PRINT( 1+2 ) /替換后:cou

37、t “a = ” 1+2 endl ; print( x , y ) /* 替換后:cout “ab = ” x * y endl ; cout “ab = ” x / y endl ; */ print( 2+6 , 4+7 ) /* 替換后:cout “ab = ” 2+6*4+7 endl ; cout “ab = ” 2+6/4+7 endl ; */運(yùn)行:請(qǐng)輸入兩個(gè)整數(shù):8 5 a = 8 a = 5a = 13 a = 3 a b = 40a b = 1 a b = 33a b = 1028第28頁編譯預(yù)處理?xiàng)l件編譯命令使用宏名作為程序段是否被編譯條件: 格式1: # ifdef

38、宏名 格式3: # ifndef 宏名 程序段 程序段 # endif # endif 格式2: # ifdef 宏名 格式4: # ifndef 宏名 程序段1 程序段1 # else # else 程序段2 程序段2 # endif # endif 作用:通常源程序中全部語句都將被編譯,但有時(shí)希望源程序中某個(gè)程序段只有在滿足某種條件時(shí)才被編譯,而條件不滿足時(shí)則不被編譯,就好像該程序段從源程序中消失了一樣,此時(shí)可選取上面格式之一來實(shí)現(xiàn)有條件編譯。 29第29頁編譯預(yù)處理?xiàng)l件編譯命令幾點(diǎn)說明: 以格式1為例,當(dāng)源程序中使用 # ifdef 宏名程序段# endif 結(jié)構(gòu)時(shí),若該程序段要被編譯,可在該結(jié)構(gòu)前面加上一條定義宏名預(yù)處理命令(# define 宏名);若該程序段不被編譯,則將其前面宏名定義命令刪除掉(刪除 #define 宏名),這種做法比從源程序中將該程序段整體刪除要簡(jiǎn)單,且不輕易犯錯(cuò)。 編譯時(shí)依據(jù)宏名是否被定義,決定某程序段是否被編譯,這種方法慣用于程序調(diào)試中。調(diào)試程序時(shí),常在程序中加入一些語句來輸出調(diào)試信息,而調(diào)試結(jié)束后這些新加入語句就不再需要了,所以可考慮將這些要加入語句用條件編譯結(jié)構(gòu)括起來一同加入到程序中。 條件編譯命令另一主要用途:將

溫馨提示

  • 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. 人人文庫網(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)論