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

下載本文檔

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

文檔簡介

1、關(guān)于函數(shù)與編譯預(yù)處理第1頁,共67頁,2022年,5月20日,10點59分,星期四第7章 函數(shù)與預(yù)處理命令7.1 概述7.2 函數(shù)的定義與調(diào)用7.3 變量作用域與存儲方式7.4 編譯預(yù)處理2第2頁,共67頁,2022年,5月20日,10點59分,星期四7.1 概述 程序結(jié)構(gòu)清晰,可讀性好。 減少重復(fù)編碼的工作量。 可多人共同編制一個大程序,縮短程序設(shè)計周期,提高程序設(shè)計和調(diào)試的效率。使用函數(shù)的好處C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)n3第3頁,共67頁,2022年,5月20日,10點59分,星期四【例7.1】求一個整數(shù)的立方。int cube (int x) /* 函數(shù)定義

2、*/ return (x * x * x); main( ) int f, a; printf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運行情況如下:Enter an integer number: 2 2 * 2 * 2 = 8函數(shù)調(diào)用程序的執(zhí)行總是從main函數(shù)開始4第4頁,共67頁,2022年,5月20日,10點59分,星期四 一個C源程序可以由一個或多個源程序文件組成。C編譯系統(tǒng)在對C源程序進(jìn)行編譯時是以文件為單位進(jìn)行的。 一個C源

3、程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。 在一個C程序中,有且僅有一個主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個程序的運行。說明5第5頁,共67頁,2022年,5月20日,10點59分,星期四 函數(shù)的種類從函數(shù)定義形式分: 有參函數(shù)在主調(diào)(用)函數(shù)和被調(diào)(用)函數(shù)之間通過參數(shù)進(jìn)行數(shù)據(jù)傳遞, 如: int cube (int x) 無參函數(shù)如:getchar( )在調(diào)用無參函數(shù)時,主調(diào)函數(shù)不需要將數(shù)據(jù)傳遞給無參函數(shù)。從使用的角度看: 標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提

4、供的。如:getchar( )、sin(x)等。在程序中可以直接調(diào)用它們。附錄A列出了C的部分庫函數(shù)。 用戶自定義函數(shù)如:例7.1中的cube函數(shù)。6第6頁,共67頁,2022年,5月20日,10點59分,星期四【例7.2】無參函數(shù)的定義與調(diào)用。void welcome ( ) printf(*n); printf( Welcome to China n); printf(*n);main( ) welcome( ); 程序的輸出結(jié)果如下:* Welcome to China*7第7頁,共67頁,2022年,5月20日,10點59分,星期四7.2.1 函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型 函數(shù)

5、名(類型名 形式參數(shù)1, ) 說明語句 執(zhí)行語句例如:求兩個數(shù)的最大值。 int max(int x, int y) int z; z = x y ? x : y; return( z );類型省略時默認(rèn)為int類型有形式參數(shù),max為有參函數(shù) 8第8頁,共67頁,2022年,5月20日,10點59分,星期四int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return(

6、z );花括號中也可以為空,這種函數(shù)叫空函數(shù) 。 例如:null( ) 不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。形參也可以這樣定義如下定義都是錯誤的 9第9頁,共67頁,2022年,5月20日,10點59分,星期四函數(shù)名(實參表列)在C語言中,把函數(shù)調(diào)用也作為一個表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);7.2.2 函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:10第10頁,共67頁,2022年,5月20日,10點59分,星期四int sum( ) int i,t

7、=0; for (i=1; i=100; i+) t+=i; return (t);main( ) int s; s=sum( ); printf(%dn, s);程序輸出結(jié)果:5050int sum ( int x ) int i,t=0; for (i=1; iy?x:y; return (z); /* 返回z的值 */main( ) int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(max is %dn,c);15第15頁,共67頁,2022年,5月20日,10點59分,星期四函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的。功能:終止

8、函數(shù)的運行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明: 若函數(shù)沒有返回值,return語句可以省略。 return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,VC系統(tǒng)警告的同時自動將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。 函數(shù)的返回值return 語句格式:return (表達(dá)式) ; return 表達(dá)式 ;return ;16第16頁,共67頁,2022年,5月20日,10點59分,星期四【例7.6】計算并輸出圓的面積。s(int r) return 3.14*r*r; main( ) int r,area; scanf(%d,&r); printf(%dn,s(r);自動轉(zhuǎn)換為

9、int型 思考:若要得到雙精度實型的圓面積,程序應(yīng)如何修改程序運行情況如下:212?17第17頁,共67頁,2022年,5月20日,10點59分,星期四 7.2.4 對被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對被調(diào)函數(shù)進(jìn)行聲明。void swap(int x, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x, int y) 1

10、8第18頁,共67頁,2022年,5月20日,10點59分,星期四對被調(diào)函數(shù)進(jìn)行聲明的一般形式 函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,);或 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,);思考:以下哪種情況需要在主調(diào)函數(shù)中對被調(diào)函數(shù)聲明被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后,且被調(diào)函數(shù)的類型不是整型的。被調(diào)函數(shù)定義在后,但被調(diào)函數(shù)的類型是整型。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。?19第19頁,共67頁,2022年,5月20日,10點59分,星期四main( ) void calc(float x,float y,char opr); float

11、 a,b; char opr; printf(nInput expression:); scanf(%f%c%f,&a,&opr,&b); calc(a,b,opr);void calc(float x,float y,char opr) switch(opr) case +:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x+y);return; case -:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x-y);return; case *:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x*y);return; cas

12、e /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return; default :printf(Operator err! n); 對被調(diào)函數(shù)的聲明【例7.7】計算并輸出兩個數(shù)的和、差、積、商。第20頁,共67頁,2022年,5月20日,10點59分,星期四7.2.5 數(shù)組作函數(shù)參數(shù)1. 一維數(shù)組元素作函數(shù)參數(shù)main( ) int a5,i,m ; for (i=0; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn, m);【例7.8】求5個數(shù)中的最小值。in

13、t min(int x, int y) return (xy?x:y); 用打擂臺方法求最小值。m相當(dāng)于擂主單向值傳遞21第21頁,共67頁,2022年,5月20日,10點59分,星期四2. 一維數(shù)組名作函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù),在調(diào)用函數(shù)時,傳遞的是數(shù)組的地址,因為數(shù)組名表示數(shù)組在內(nèi)存中的起始地址,這種傳遞稱為地址傳遞。 例如:數(shù)組a在內(nèi)存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù)(第8中將介紹指針類型),不能把它看成是整型或其他類型數(shù)據(jù)。實參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長度可以省略,但 不能省,否則就不是數(shù)組形式了。 【例7.9】用冒

14、泡法將10個整數(shù)排序。22第22頁,共67頁,2022年,5月20日,10點59分,星期四void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a);void printarr ( int b10 ) int i; for (i=0; i10; i+) printf(%5d,bi); printf(

15、n);void sort ( int b , int n ) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 地址傳遞23第23頁,共67頁,2022年,5月20日,10點59分,星期四 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 3

16、6 45 58 63 73 80 97(b) 排序后圖7.3 調(diào)用sort函數(shù)2000b形參 b 實際是一個可以存放地址的變量a:2000實參賦給形參首地址: 2000首地址: 200024第24頁,共67頁,2022年,5月20日,10點59分,星期四#include stdio.hmain( ) void scat(char str1 ,char str2 ); char s150,s250; int i,k; printf(Input s1:); gets(s1); printf(Input s2:); gets(s2); scat(s1,s2); printf(Output s1:%s

17、n,s1);void scat(char str1 ,char str2 ) int i=0,k=0; for ( ; str1i!=0 ; i+; ) ; for ( ; str2k!=0 ; i+, k+) str1i=str2k; str1i=0;scat函數(shù)還可簡化為:void scat(char str1 ,char str2 ) int i=0,k=0; for ( ; str1i ; i+ ) ; for ( ; str1i+=str2k+ ; ) ;【例7.10】編程序,實現(xiàn)字符串連接。25第25頁,共67頁,2022年,5月20日,10點59分,星期四以二維數(shù)組為例。二維數(shù)組

18、名作實參時,對應(yīng)的形參也應(yīng)該定義為一個二維數(shù)組形式。對形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小說明。【例】編程序,將矩陣轉(zhuǎn)置。設(shè)轉(zhuǎn)置前為a矩陣,轉(zhuǎn)置后為b矩陣,如下所示: a=1 2 3 4 5 6 7 89 10 11 121 5 92 6 103 7 114 8 12b=思路:將a00b00,a01 b10,a02b20,a10b01,aijbji,。2. 多維數(shù)組作函數(shù)參數(shù)26第26頁,共67頁,2022年,5月20日,10點59分,星期四void turn( ); main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,

19、b43; turn(a,b); printf(array b:n); for (i=0; i4; i+) for (j=0; j3; j+) printf(%5d,bij); printf(n); /* 矩陣轉(zhuǎn)置函數(shù) */void turn(int arra 4,int arrb 3) int r, c; for (r=0; r3;r+) for (c=0; c0; i-) a+=sub2(i); return a ; sub2(int n) return n+1; 程序輸出結(jié)果:9 29第29頁,共67頁,2022年,5月20日,10點59分,星期四2. 函數(shù)的遞歸調(diào)用(略)(1)遞歸的基本

20、概念遞歸調(diào)用:一個函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接調(diào)用sub函數(shù)本身30第30頁,共67頁,2022年,5月20日,10點59分,星期四(2)遞歸函數(shù)的執(zhí)行過程【例7.12】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時,n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (n1)31第31頁,共67頁,2022年,

21、5月20日,10點59分,星期四程序如下:float fact (int n) float f=0; if(n0) printf(n0,error!); else if (n=0 | n=1) f=1; else f=fact(n-1)*n; return (f);main( ) int n; float y; printf(nInput n:); scanf(%d,&n); y=fact(n); printf(%d!=%-10.0fn,n,y);運行情況如下:Input a integer number:44!=2432第32頁,共67頁,2022年,5月20日,10點59分,星期四遞歸調(diào)用

22、過程 回 推main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 return 6 return 2 return 1 遞 推 33第33頁,共67頁,2022年,5月20日,10點59分,星期四7.3 局部變量和全局變量及其作用域7.3.1 變量的作用域1. 局部變量及其作用域變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:

23、函數(shù)內(nèi)或復(fù)合語句內(nèi)?!纠?.13】分析下面程序的運行結(jié)果及變量的作用域。問題:一個變量在程序的每個函數(shù)中都能使用嗎?34第34頁,共67頁,2022年,5月20日,10點59分,星期四void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); 局部變量main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int

24、a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); 局部變量局部變量程序輸出結(jié)果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 135第35頁,共67頁,2022年,5月20日,10點59分,星期四2. 全局變量及其作用域全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序

25、中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時不起作用。【例7.14】全局變量和局部變量的作用域。36第36頁,共67頁,2022年,5月20日,10點59分,星期四int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;printf(%dt%dt%dn,a,b,c); 局部變量main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); c=10; printf(%dt%dt%dn, a,b,c); pri

26、ntf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 局部變量局部變量程序輸出結(jié)果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局變量37第37頁,共67頁,2022年,5月20日,10點59分,星期四7.3.2 變量的存儲類別及變量的生存期1. 變量的生存期與變量的存儲分類變量的生存期:變量在內(nèi)存中占據(jù)存儲空間的時間。思考:1. 何時為變量分配內(nèi)存單元? 2. 將變量分配在內(nèi)存的什么區(qū)域? 3. 變量占據(jù)內(nèi)存的時間(生存期)?程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量38第38頁,共67頁,2022年,5

27、月20日,10點59分,星期四2. 變量的存儲類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長度;數(shù)據(jù)的存放形式;數(shù)的范圍。存儲類別:決定了變量的生存期;給它分配在哪個存儲區(qū)。39第39頁,共67頁,2022年,5月20日,10點59分,星期四變量定義語句的一般形式存儲類別 數(shù)據(jù)類型 變量名1, , 變量名n ;auto(自動的) register(寄存器的)static(靜態(tài)的) extern(外部的)A. 自動變量(auto類別) 局部變量可以定義為自動變量。main()int x,y; main()auto int x,y; 自動變量等價可省40第40頁,共67頁,2022年,5月20

28、日,10點59分,星期四 內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時在動態(tài)存儲區(qū)為其分配存儲單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。 變量的初值定義變量時若沒賦初值,變量的初值不確定,應(yīng)該賦值;如果在一個程序中函數(shù)被多次調(diào)用,則每次函數(shù)被調(diào)用時執(zhí)行一次賦值操作。 生存期 在函數(shù)或分程序執(zhí)行期間。 作用域自動變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動變量41第41頁,共67頁,2022年,5月20日,10點59分,星期四B靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。局部靜態(tài)變量(或稱內(nèi)部靜態(tài)變量)全局靜態(tài)變量(或稱外部靜態(tài)變量)靜態(tài)變量靜態(tài)變量static int a; m

29、ain( ) float x,y; f( ) static int b=1; 全局靜態(tài)變量局部靜態(tài)變量自動變量不能省42第42頁,共67頁,2022年,5月20日,10點59分,星期四 內(nèi)存分配編譯時,將其分配在內(nèi)存的靜態(tài)存儲區(qū)中,程序運行結(jié)束釋放該單元。 靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0;若定義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值 。 生存期整個程序的執(zhí)行期間。 作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。靜態(tài)變量43第43頁,共67頁,2022年,5月20日,10點59分,星期四44

30、int c;static int a; main( ) float x,y; char s;f( ) static int b=1; 在函數(shù)外定義的變量若沒有用 static說明,則是外部變量。外部變量只能隱式定義為extern類別,不能顯式定義。全局靜態(tài)變量自動變量局部靜態(tài)變量外部變量C. 外部變量(extern類別)第44頁,共67頁,2022年,5月20日,10點59分,星期四 extern 數(shù)據(jù)類型 變量名1,變量名n;或 extern 變量名1,變量名n;注意:外部變量聲明用關(guān)鍵字extern,而外部變量的定義不能用extern,只能隱式定義。定義外部變量時,系統(tǒng)要給變量分配存儲空間

31、,而對外部變量聲明時,系統(tǒng)不分配存儲空間,只是讓編譯系統(tǒng)知道該變量是一個已經(jīng)定義過的外部變量,與函數(shù)聲明的作用類似。外部變量(extern類別)的聲明45第45頁,共67頁,2022年,5月20日,10點59分,星期四【例7.16】在多文件的程序中聲明外部變量。file1.c文件中程序如下:int i;main( ) void f1( ),f2( ),f3( ); i=1; f1( ); printf(tmain: i=%d,i); f2( ); printf(tmain: i=%d,i); f3( ); printf(tmain: i=%dn,i);void f1( ) i+; printf

32、(nf1: i=%d,i);file2.c文件中程序如下:extern int i; void f2( ) int i=3; printf(nf2: i=%d,i);void f3( ) i=3; printf(nf3: i=%d,i);程序輸出結(jié)果:f1: i=2 main: i=2f2: i=3 main: i=2f3: i=3 main: i=3聲明外部變量定義外部變量46第46頁,共67頁,2022年,5月20日,10點59分,星期四第47頁,共67頁,2022年,5月20日,10點59分,星期四局部變量(靜態(tài)局部變量與動態(tài)局部)靜態(tài)局部變量 與自動變量(動態(tài)局部) 的區(qū)別:對局部靜態(tài)

33、變量來說,當(dāng)多次調(diào)用一個函數(shù)時,每次調(diào)用完以后,保留其變量的值。而對自動變量來說,當(dāng)多次調(diào)用一個函數(shù)時,每次都為其變量賦初值。全局變量(全局靜態(tài)變量與外部變量)全局靜態(tài)變量與外部變量的區(qū)別在于:全局靜態(tài)變量的作用域為所在源文件,而外部變量的作用域為所在源程序。一個源程序由若干個源文件組成幾種變量的區(qū)別第48頁,共67頁,2022年,5月20日,10點59分,星期四例7.15 靜態(tài)局部變量與自動變量的區(qū)別main( ) int i;void f( );for( i=1;i=3;i+ )f( ); void f( ) auto int j=0;+j; printf( “%dn”,j );stati

34、c 輸出:111輸出:123第49頁,共67頁,2022年,5月20日,10點59分,星期四D. 寄存器變量(register類別)只有函數(shù)內(nèi)定義的變量或形參可以定義為寄存器變量。寄存器變量的值保存在CPU的寄存器中。受寄存器長度的限制,寄存器變量只能是char、int和指針類型的變量。【例7.17】寄存器變量的使用。main( ) long int sum=0; register int i; for (i=1; i(Y)?(X):(Y)7.4 編譯預(yù)處理(續(xù))58第58頁,共67頁,2022年,5月20日,10點59分,星期四7.4 編譯預(yù)處理(續(xù))【例7.19】帶參數(shù)的宏定義。#defi

35、ne MAX(x,y) (x)(y)?(x):(y)main( ) printf(%dn,a,b, MAX(a,b); printf(%dn,MAX(a+m,b+n);分兩次替換:將宏名MAX(a,b) 替換成字符串 (x)(y)?(x):(y)。用實參a替換形參x,實參b替換形參y。程序中的兩個printf語句被展開為:printf(%dn, (a)(b)?(a):(b); printf(%dn, (a+m)(b+n)?( a+m):( b+n);59第59頁,共67頁,2022年,5月20日,10點59分,星期四7.4 編譯預(yù)處理(續(xù))【例7.20】分析下面程序運行后的輸出結(jié)果。#define MA(x) x*(x-1)main( ) int a=1,b=2; printf(%dn, MA(1+a+b);分兩次替換: MA(1+a+b) 用x*(x-1) 替換。用1+a+b替換x。printf語句被展開為:printf(%dn, 1+a+b*(1+a+b-1);特別注意:由于替換文本中的x沒有用括號括起,因此,1+a+b也不能用

溫馨提示

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

評論

0/150

提交評論