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

下載本文檔

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

文檔簡介

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

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

3、64第4頁 main()函數(shù)調(diào)用 fun(3) 時執(zhí)行過程:main()函數(shù)調(diào)用 fun(3) 時棧中改變情況:局部變量: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í)行過程比較復雜,往往都存在著連續(xù)遞歸調(diào)用,其執(zhí)行過程可分為 “遞推” 和 “回歸” 兩個階段,先是一次一次不停遞推過程,直到符合遞歸結(jié)束條件,然后是一層一層回歸過程。 而其中每一次遞歸調(diào)用,系統(tǒng)都要在棧

5、中分配空間以保留該次調(diào)用返回地址、參數(shù)、局部變量,所以在遞推階段,??臻g一直處于增加狀態(tài),直到碰到遞歸結(jié)束條件,然后進入回歸階段,??臻g反向依次釋放。 在遞歸執(zhí)行過程中,遞歸結(jié)束條件非常主要,它控制 “遞推” 過程終止,所以在任何一個遞歸函數(shù)中,遞歸結(jié)束條件都是必不可少,不然將會一直 “遞推” 下去。造成無窮遞歸。遞歸算法缺點:內(nèi)存消耗巨大,且連續(xù)地調(diào)用和返回操作占用較多CPU時間。遞歸算法優(yōu)點:算法描述簡練易懂。6第6頁【例】(分析下面遞歸函數(shù)執(zhí)行過程,并給出程序運行結(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 ) ; 運行: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頁【例】(用遞歸算法計算從n個人中選擇k個人組成一個委員會不一樣組合數(shù)。 ) 分析:確立遞歸公式:由 n 人中選 k 人組合數(shù) = 由 n-1 人中選 k 人組合數(shù) + 由 n-1 人中選 k-1 人組合數(shù) 分析遞歸結(jié)束條件:當 n=k 或 k=0 時,組合數(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 ) ) ; /再進行遞歸調(diào)用void main ( ) int n , k ; cout n k ; if ( n=0 | k=0 ) cout “輸入數(shù)據(jù)有錯!” ; exit(0) ; cout “由” n “人中選” k “人組合數(shù) = ” comm( n, k ) endl ; 運行:請輸入正整數(shù) n 和 k:8 5 由8人中選5人組合數(shù) = 56 8第8頁【例】(漢

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

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

11、hree , two ) ; /將one柱上n-1個盤子移動到two柱(借助three柱), 進行遞歸調(diào)用 move ( one , three ) ; /將one柱上剩下一個盤子移動到three柱上 hanoi ( n-1 , two , one , three ) ; /將two柱上n-1個盤子移動到three柱(借助one柱), 進行遞歸調(diào)用 10第10頁void main ( ) int n ; cout n ; cout “將” n “個盤子從A柱移動到C柱步驟:” endl ; hanoi ( n , A , B , C ) ; 運行:請輸入盤子數(shù):4 將4個盤子從A柱移動到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+一個程序中能夠用同一個函數(shù)名來命名多個函數(shù),這些同名函數(shù)在參數(shù)個數(shù)、類型上一定有所不一樣,分別代表不一樣函數(shù),當同名多個函數(shù)出現(xiàn)在同一個作用域內(nèi)時,稱為重載函數(shù)。 重載目標:程序中經(jīng)常將功效相近函數(shù)在相同作用域內(nèi)以相同函數(shù)名命名,從而形成重載函數(shù),目標是方便使用,便于記憶。【例】 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ù)個數(shù)不一樣12第12頁重載函數(shù)注意事項注意事項: 重載函數(shù)形參必須有所不一樣:參數(shù)個數(shù)或參數(shù)類型不一樣。 編譯系統(tǒng)是依據(jù)實參加形參在類型及個數(shù)上最正確匹配來選擇調(diào)用哪一個函數(shù)。 【例】 定義重載函數(shù)時,要防止

14、二義性,以免編譯系統(tǒng)無法確定到底調(diào)用哪一個函數(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 ) ;當調(diào)用 add ( 200 , A ) 時,編譯器無法確定到底調(diào)用哪一個函數(shù)。13第13頁【例】# include int add ( int x , int y )

15、 /重載函數(shù) cout “正在進行:兩個 int 型數(shù)據(jù)相加!tt” ; return ( x + y ) ; float add ( float x , float y ) /重載函數(shù) cout “正在進行:兩個 float 型數(shù)據(jù)相加!tt” ; return ( x + y ) ; double add ( double x , double y ) /重載函數(shù) cout “正在進行:兩個 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 ; 運行:正在進行:兩個 int 型數(shù)據(jù)相加! 13正在進行:兩個 float 型數(shù)據(jù)相加! 13.2正在進行:兩個 double 型數(shù)據(jù)相加! 13.4正在進行:兩個 int 型數(shù)據(jù)相加! 6正在進行:兩個

17、double 型數(shù)據(jù)相加! 6.2正在進行:兩個 int 型數(shù)據(jù)相加! 11514第14頁帶默認值形參默認形參值作用:函數(shù)申明時能夠給形參指定一個默認值,調(diào)用時若給出實參,則形參采取實參值,若沒有給出對應實參,則該形參采取預先給出默認值?!纠? include int add ( int x = 10 , int y = 20 ) /帶默認形參值函數(shù) cout “正在進行:” 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 ; 運行:正在進行:30 + 40 = 70正在進行:50 + 20 = 70正在進行:10 + 20 = 30正在進行:50 + 4 = 54正在進行:65 + 49 = 114正在進行:65 + 20 = 8515第15頁帶默認值形參帶默認值形參申明次序:函數(shù)必須按從右往左次序逐一申明帶默認值形參,且在帶默認值形參右面不能出現(xiàn)不帶默認值形參。只有這么要求后,在函數(shù)調(diào)用時才不會產(chǎn)生二義性?!纠?int add ( int

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

20、 時,編譯器調(diào)用 add ( 1 , 2 , 3 ) 。當程序中調(diào)用 add ( 10 ) 時,編譯器調(diào)用 add ( 10 , 2 , 3 ) 。當程序中調(diào)用 add ( 10 , 20 ) 時,編譯器調(diào)用 add ( 10 , 20 , 3 ) 。16第16頁帶默認值形參默認形參值僅能申明一次:若函數(shù)定義在前、調(diào)用在后,默認形參值在函數(shù)定義時申明;若函數(shù)調(diào)用在前、定義在后,默認形參值必須在函數(shù)原型申明中給出,且在之后該函數(shù)定義時,不能再重復指定默認形參值?!纠? include int add ( int x = 1 , int y = 2 ) ; /帶默認形參值函數(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 “正在進行:” x “ + ” y “ = ” ; return ( x + y ) ;運行:正在進行:3 + 4 = 7正在進行:5 + 2 = 7正在進行:1 + 2 = 317第17頁帶默認值形參默認形參值作用域:同一個函數(shù)在相同作用域內(nèi),默認形參值應保持唯一,但在不一樣作用域內(nèi),可提供不一樣默認形參值?!纠? 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 ; /使用局部默認形參值(實現(xiàn)3+4) fun( ) ; void fun ( ) /函數(shù)fun()定義性申明 cout add( ) endl ; /使用全局默認形參值(實現(xiàn)1+2) cout add( 10 ) endl ; int add ( int x , int y ) /函數(shù)add()定義性申明

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

24、器自行決定。另外內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán) 、switch 等復雜結(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 ; 運行:半徑 = 3面積 = 28.2735半徑 = 5面積 = 78.537519第19頁程序多文件結(jié)構(gòu)多文件程序: 在C+中,一個較大程序通常被分解為若干個源程序文件,然后

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

26、20第20頁【例】(本程序由兩個文件組成: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 “進入函數(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)過,但連接犯錯,f0()僅能在c2.cpp中使用 cout f1 ( 1 , 2 ) endl ; cout f2 ( 3 ) endl ; cout f3 ( ) endl ; cout f4 ( 5 , 6 ) en

28、dl ;運行:進入函數(shù) f1() 了! 16進入函數(shù) f2() 了! 15進入函數(shù) f3() 了! 進入函數(shù) f0() 了! 216進入函數(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 “進入函數(shù) f0() 了!t” ; return ( x * x ) ;int f2 ( int x ) /

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

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

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

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

33、ef 宏名 在同一個作用域內(nèi),同一個宏名不允許定義兩次或兩次以上,不然編譯預處理在進行宏替換時,會出現(xiàn)二義性。 在一個宏定義中能夠使用前面已定義過宏名。25第25頁編譯預處理 #define 命令 宏替換時,只對宏名做簡單替換,不做任何計算,也不做任何語法檢驗,若宏定義時書寫不正確,會得到不正確結(jié)果或編譯時出現(xiàn)語法錯誤。 當宏名出現(xià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 ; 運行:輸出: B南

35、C京A輸出: 8輸出: 23輸出: 64輸出: A26第26頁編譯預處理 #define 命令帶參數(shù)宏定義: 格式: # define 宏名( 形參表 ) 宏體 形參表由若干個參數(shù)名組成,參數(shù)之間以逗號分隔。 宏體由若干個參數(shù)組成一個式子。 處理過程:類似于函數(shù)處理過程,先將宏調(diào)用中實參替換宏定義中形參,即先進行參數(shù)替換,再進行宏替換。幾點說明: 宏名是一個標識符,與后面形參表左括號之間不得有空格。 所謂參數(shù)替換,是指用宏調(diào)用中每一個實參字符序列去替換宏定義中對應形參,且只做簡單替換,不做任何計算 。 一個宏定義應在一行內(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 ; */運行:請輸入兩個整數(shù):8 5 a = 8 a = 5a = 13 a = 3 a b = 40a b = 1 a b = 33a b = 1028第28頁編譯預處理條件編譯命令使用宏名作為程序段是否被編譯條件: 格式1: # ifdef

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

溫馨提示

  • 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

提交評論