




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第六章 函數(shù)與編譯預(yù)處理,6.1 模塊化程序設(shè)計(jì)與函數(shù),6.2 函數(shù)的定義與調(diào)用,6.4 變量作用域與存儲(chǔ)方式,返回,6.3 函數(shù)的遞歸調(diào)用,6.5 編譯預(yù)處理,C語言程序設(shè)計(jì)教程,6.1模塊化程序設(shè)計(jì)與函數(shù),在設(shè)計(jì)較復(fù)雜的程序時(shí),我們一般采用的方法是:把問題分成幾個(gè)部分,每部分又可分成更細(xì)的若干小部分,逐步細(xì)化,直至分解成很容易求解的小問題。這樣的話,原來問題的解就可以用這些小問題來表示。,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.1.1 模塊與函數(shù),C語言程序由基本語句和函數(shù)組成,每個(gè)函數(shù)可完成相對(duì)獨(dú)立的任務(wù),依一定的規(guī)則調(diào)用這些函數(shù),就組成了解決某個(gè)特定問題的程序。,下一頁,第6章 函數(shù)與編
2、譯預(yù)處理,把大任務(wù)分解成若干功能模塊,用多個(gè)函數(shù)來實(shí) 現(xiàn) 這些功能模塊。 通過函數(shù)的調(diào)用來實(shí)現(xiàn)完成大任務(wù)的全部功能。,任務(wù)、模塊與函數(shù)的關(guān)系:一個(gè)大任務(wù)分成多個(gè)功能模塊,功能模塊則由一個(gè)或多個(gè)函數(shù)實(shí)現(xiàn)。,模塊化的程序設(shè)計(jì)是靠設(shè)計(jì)函數(shù)和調(diào)用函數(shù)實(shí)現(xiàn)的。,任務(wù): 輸入三個(gè)數(shù),從大到小的順序的輸出。如果大于等于85,在該數(shù)后面輸出A,小于85且大于等于70,則輸出B,小于70且大于等于60,輸出C,如果小于60,則輸出D。,思路:scanf()輸入分?jǐn)?shù)另建一個(gè)排序函數(shù)判斷并輸出等級(jí)函數(shù)打印分?jǐn)?shù)及等級(jí)的函數(shù),雖然也可以由一個(gè)主函數(shù)來完成,但這樣做可讀性及操作性會(huì)更好。,下一頁,第6章 函數(shù)與編譯預(yù)處理
3、,例如分?jǐn)?shù)排序,點(diǎn)擊,查看程序請(qǐng),6.1.2模塊設(shè)計(jì)的原則,下一頁,第6章 函數(shù)與編譯預(yù)處理,獨(dú)立性原則表現(xiàn)在模塊完成獨(dú)立的功能,和其它模塊間的關(guān)系簡單,各模塊可以單獨(dú)調(diào)試。修改某一模塊,不會(huì)造成整個(gè)程序的混亂。,要做到模塊的獨(dú)立性要注意以下幾點(diǎn),點(diǎn)擊,模塊不能太大,但也不能太小。模塊的功能復(fù)雜,可讀性就不好,而且也違背獨(dú)立性原則。但如果做得太小,實(shí)際上也會(huì)復(fù)雜各個(gè)模塊間反復(fù)調(diào)用,可讀性也會(huì)降低。這點(diǎn)需要慢慢積累經(jīng)驗(yàn),好好把握。,下一頁,第6章 函數(shù)與編譯預(yù)處理,分解模塊要注意層次,更多層次的分解任務(wù),要注意對(duì)問題進(jìn)行抽象化。開始不要過于注意細(xì)節(jié),要做到逐步細(xì)化求精。,6.1.3 算法描述簡介
4、,什么是算法? 通俗地說,算法是解決一類特定問題的方法和步驟。,下一頁,第6章 函數(shù)與編譯預(yù)處理,算法描述的任務(wù)是將解題步驟和方法用一定的形式表示出來,要清楚、準(zhǔn)確、嚴(yán)謹(jǐn),還要可讀性好,方便實(shí)現(xiàn)。算法兩大要素: 一是操作,用類計(jì)算機(jī)語句或自然語言描述。 二是控制結(jié)構(gòu),描述算法一般可以用流程圖描述。,設(shè)計(jì)算法:找出a,b兩數(shù)中的較大者,并輸出,分析: 這個(gè)問題分三個(gè)步驟: 輸入兩個(gè)數(shù); 找出其中的大數(shù); 輸出大數(shù)。,第6章 函數(shù)與編譯預(yù)處理,例6.2,算法流程圖見右,返回,6.2 函數(shù)的定義與調(diào)用,在C語言中,函數(shù)(Function)是一個(gè)處理過程,可以進(jìn)行數(shù)值運(yùn)算、信息處理、控制決策,即一段程
5、序的工作放在函數(shù)中進(jìn)行,函數(shù)結(jié)束時(shí)可以攜帶或不帶處理結(jié)果。 庫函數(shù)(標(biāo)準(zhǔn)函數(shù)):系統(tǒng)提供自定義函數(shù):用戶自己寫,下一頁,第6章 函數(shù)與編譯預(yù)處理,C語言程序處理過程全部都是以函數(shù)形式出現(xiàn),最簡單的程序至少也有一個(gè)main函數(shù)。函數(shù)必須先定義和聲明后才能調(diào)用。,“函數(shù)”的主要知識(shí)點(diǎn),函數(shù)的定義 函數(shù)的參數(shù)和返回值 函數(shù)的調(diào)用 嵌套和遞歸 變量的作用域,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.2.1 標(biāo)準(zhǔn)庫函數(shù),C語言有豐富的庫函數(shù),這些函數(shù)的說明在不同的頭文件(*.h)中。,想要調(diào)用標(biāo)準(zhǔn)的庫函數(shù),就必須include。,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.2.2 函數(shù)的定義,可以把完成一個(gè)任務(wù)的
6、過程寫成函數(shù)。,int A_to_a(int capital)int small; if (capital=A ,下一頁,第6章 函數(shù)與編譯預(yù)處理,#include main() int a,b,m; /*說明變量*/ int max(int a,int b); /*函數(shù)聲明*/ scanf(%d,%d, /*調(diào)用庫函數(shù)getch*/,下一頁,第6章 函數(shù)與編譯預(yù)處理,舉例,int max(int a,int b) /*定義函數(shù)max*/ int y; y=(ab)? a:b; /*條件表達(dá)式 */ return y;,自定義函數(shù)的聲明,自定義函數(shù)在調(diào)用前應(yīng)先聲明。使系統(tǒng)知道將要用到某個(gè)函數(shù)及
7、它的類型,以便處理。函數(shù)聲明應(yīng)與該函數(shù)定義時(shí)給出的函數(shù)類型與名字、形參的個(gè)數(shù)、類型、次序相一致。,#include “stdio.h”void main()float x,y; int n; float power (float x, int n); scanf(%f,%d, ,float power( float x, int n) int i; float t=1; for(i=1; i=n; i+) t = t * x; return t; ,下一頁,第6章 函數(shù)與編譯預(yù)處理,求1!+2!+3!+10!,算法:i =1; s=0; 當(dāng) i = 10 s=s+ i! 定義求 i! 的函數(shù),
8、下一頁,第6章 函數(shù)與編譯預(yù)處理,void main() long mm( int ); /*自定義求階乘函數(shù)應(yīng)先聲明 */ int i; long s=0; for (i =1; i =10; i +) s+= mm(i ); /*調(diào)用求階乘函數(shù),求I的階乘 */ printf(“n%ld”,s); ,舉例,函數(shù)的參數(shù),int max(int a,int b) int y; y=(ab)? a:b; return y; ,調(diào)用時(shí): m=max(3,6); m=max(a,b);,下一頁,第6章 函數(shù)與編譯預(yù)處理,形式參數(shù)與實(shí)際參數(shù)的關(guān)系,形式參數(shù)在函數(shù)中是變量名,在函數(shù)調(diào)用時(shí),形參被分配相應(yīng)
9、的內(nèi)存。 實(shí)際參數(shù)是表達(dá)式負(fù)責(zé)向?qū)?yīng)的形參標(biāo)識(shí)的內(nèi)存單元傳遞數(shù)據(jù)。 實(shí)參與形參必須個(gè)數(shù)相同。 對(duì)應(yīng)的形參和實(shí)參的類型必須一致。,下一頁,第6章 函數(shù)與編譯預(yù)處理,主調(diào)函數(shù)中有如下語句: scanf(%d,%d, 如果輸入 6,2 函數(shù) int max(int a,int b) 形參 a 得到第一個(gè)實(shí)際參數(shù)a的值 6 形參 b 得到第二個(gè)實(shí)際參數(shù)b+3的值 5,例如,函數(shù)返回值,函數(shù)返回值通過return語句獲得 函數(shù)返回值的類型就是函數(shù)的類型 return y; 將變量y的值返回給調(diào)用者 return y+3; 將表達(dá)式的值返回給調(diào)用者 return 的數(shù)據(jù)類型與函數(shù)的類型矛盾時(shí),自動(dòng)將數(shù)據(jù)轉(zhuǎn)
10、換成函數(shù)的類型,下一頁,第6章 函數(shù)與編譯預(yù)處理,int funct1() char ch; while (ch=getch( )z) ; return ch; ,調(diào)用: i=funct1(); 返回的是int類型,函數(shù)沒有返回值, 函數(shù)定義成空類型,void putline() int i; for (i=0;i35;i+) printf(-); printf(n); ,函數(shù)的功能就是輸出35個(gè)- 調(diào)用: putline( ); 應(yīng)該的語句形式 i=putline( ); 是錯(cuò)的,下一頁,第6章 函數(shù)與編譯預(yù)處理,調(diào)用函數(shù),a=function(x,y);或者function(x,y);,取
11、返回值只是操作,解決更復(fù)雜問題時(shí)可以嵌套調(diào)用,long fac(int k)long f=1; int i; for(i=1;i=n;i+) f=f*i; retrun f;long combination(int n ,int m)long c; int i; c=fac(m)/(fac(n)*fac(m-n) ); retrun c;主函數(shù):main( ) int n,m; long c; scanf(“%d,%d”, ,理論上可以a(b(d(e(x),c(f)般嵌套無數(shù)層,第6章 函數(shù)與編譯預(yù)處理,返回,6.3 函數(shù)的遞歸調(diào)用,函數(shù)調(diào)用它本身,稱為遞歸。直接在函數(shù)內(nèi)調(diào)用自己為直接遞歸,通
12、過別的函數(shù)調(diào)用自己為間接遞歸。,void a( ). a( );.,void a( ). b( ); .void b( ). a( ); .,遞歸在解決某些問題中,是一個(gè)十分有用的方法。因?yàn)槠湟?有的問題它本身就是遞歸定義的;其二,它可以使某些看起來不易解決的問題變得容易解決,寫出的程序較簡短。,下一頁,第6章 函數(shù)與編譯預(yù)處理,例:遞歸方法求n!,由于 n!= n*(n-1)! 是遞歸定義 所以求n! (n-1)! (n-1)! (n-2)!(n 2)! (n-3)! 0!的問題, 根據(jù)公式有0!=1。 再反過來依次求出1!,2!直到最后求出n!。,下一頁,第6章 函數(shù)與編譯預(yù)處理,long
13、 fac( int n)long f; if (n=0) f=1; else f=n* fac(n-1); return f;main( )long y; int n; scanf(“%d”,剛開始的時(shí)候,這個(gè)n是前面輸入的需要階乘的n,所以在這里帶入的值是n,而這個(gè)函數(shù)里又調(diào)用了本身,不過參數(shù)已經(jīng)變成了n-1,所以這里再次調(diào)用時(shí)參數(shù)已經(jīng)變成了n-1 注意:上次調(diào)用fac(n)還沒有完,只是由于遇到了fac(n-1)而執(zhí)行fac(n-1)去了.,而在調(diào)用fac(n-1)時(shí)同樣遇到了要調(diào)用fac(n-2)的 問題,于是一層一層的包裹下去,每次調(diào)用的時(shí)候都會(huì)在內(nèi)部調(diào)用一個(gè)結(jié)構(gòu)相同但變量不同的函數(shù),
14、直到。,直到調(diào)用到fac(0)時(shí), 由于內(nèi)部if判斷,已經(jīng)不需要再繼續(xù)調(diào)用另一個(gè)fac(n-1),而直接有了f=1,fac(0)已經(jīng)執(zhí)行完畢,它的返回值被fac(1)中的f=n*fac(n-1)語句賦給了f值,同時(shí)返回了f。 而這個(gè)返回的f又被fac(2)乘上當(dāng)前的n值以后繼續(xù)返回f,直到最后的fac(n)都做完了,f的值被返回到了它的調(diào)用點(diǎn):主函數(shù)中,這樣就是一個(gè)遞歸運(yùn)算。,下一頁,第6章 函數(shù)與編譯預(yù)處理,程序,第1個(gè)月有1對(duì)兔子 過2個(gè)月,兔子就可每個(gè)月生1對(duì)兔子 問第n個(gè)月有多少對(duì)兔子? 分析: 設(shè)第n個(gè)月有f(n)對(duì)兔子 根據(jù)題意有 f(1)=1, f(2)=1 f(n)= f(n-
15、1) + f(n-2) f(n-1): 前一個(gè)月的兔子數(shù) f(n-2): 本月生的兔子數(shù),下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸舉例,例1,定義函數(shù)f(n),long f(int n ) switch (n ) case 1: return 1; case 2: return 1; default: return f(n-1) + f(n-2); /*調(diào)用函數(shù)f(n) */ ,下一頁,第6章 函數(shù)與編譯預(yù)處理,下一頁,第6章 函數(shù)與編譯預(yù)處理,兔子問題主函數(shù),void main() long f(int n ); /*自定義函數(shù)聲明 */ int n; printf(“n input n:”)
16、;scanf(“%d”, /*調(diào)用函數(shù)f(n) */ ,輾轉(zhuǎn)相除法求最大公約數(shù),求 m和 n 的公約數(shù)算法 if (m % n) = 0 n 是公約數(shù); else 求 n 和 m % n 的公約數(shù);,下一頁,第6章 函數(shù)與編譯預(yù)處理,例2,求最大公約數(shù)的遞歸算法,int gcd(int m, int n) if (m % n) = 0 return n ; else return gcd(n, m % n); ,求最大公約數(shù)的主函數(shù),void main() int m,n,t;int gcd(int m, int n);scanf(“%d %d”, ,下一頁,第6章 函數(shù)與編譯預(yù)處理,漢諾塔,
17、說到遞歸,就不能不提漢諾塔,漢諾塔是一個(gè)很繁雜的游戲,但可以用遞歸的方法異常簡單的完成。,規(guī)則:(1) 一次只能移動(dòng)一個(gè) (2) 大的不能放在小的上面 (3) 只能在三個(gè)位置中移動(dòng),下一頁,第6章 函數(shù)與編譯預(yù)處理,例3,1,2,3,問題可分為三個(gè)步驟,對(duì)于把n個(gè)金片從第一根針a上移到第三根針c的問題可以分解成如下步驟: (1)將n-1個(gè)金片從a經(jīng)過c 移動(dòng)到b。 (2)將第n個(gè)金片移動(dòng)到c。 (3)再將n-1個(gè)盤子從b經(jīng)過a移動(dòng)到c。,這樣我們就將移動(dòng)n個(gè)金片的問題變成了移動(dòng)n-1個(gè)金片的問題。這樣做下去的話最后就會(huì)變成移動(dòng)一個(gè)金片的問題。,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸方法解漢諾塔
18、,void hanoi(int n, int a, int b, int c) if (n=1) printf(“%d -%d”,a,c); else hanoi(n-1,a,c,b); printf(“%d -%d”,a,c); hanoi(n-1,b,a,c); ,主函數(shù): main( ) int n; printf(“input n:”); scanf(“%d”, ,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸漢諾塔步驟,下一頁,第6章 函數(shù)與編譯預(yù)處理,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸漢諾塔步驟,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸漢諾塔步驟,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸漢
19、諾塔步驟,下一頁,第6章 函數(shù)與編譯預(yù)處理,遞歸漢諾塔步驟,第6章 函數(shù)與編譯預(yù)處理,遞歸漢諾塔步驟,返回,6.4 變量的作用域與存儲(chǔ)方式,先看一個(gè)例子,錯(cuò)在那里?: void f1( ) int t=2; a *= t; b /= t; main() int a, b; printf(“ Enter a,b:”); scanf(“%d,%d”, ,編譯程序會(huì)提示出錯(cuò): Undefined symbol a 和 Undefined symbol b 。為什么?,下一頁,第6章 函數(shù)與編譯預(yù)處理,變量的作用域即變量的有效范圍 1.變量按作用域分為全局變量和局部變量 2.比較: 全局變量(外部變量
20、) 局部變量(內(nèi)部變量) 定義位置: 函數(shù)體外 函數(shù)體內(nèi) 作用域 : 從定義處到本源 從定義處到本函數(shù)結(jié)束 文件結(jié)束 舉例 : 所有函數(shù)體外定義 (1)所有在函數(shù)體內(nèi)定義 的變量 (2)形式參數(shù),與局部變量同名的處理 局部變量屏蔽全局變量,不同函數(shù)中同名局部變量互不干擾,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.4.1 變量的作用域,注意,#include int a,b; /*a,b為全局變量*/ void f1(int x ) int t1,t2,a; a=t1 = x* 4; t2 = b * 3; b = 10; printf (“f1:t1=%d,t2=%d,a=%d,b=%dn”, t
21、1,t2,a,b); main( ) a=2; b=4; /* 此a,b是全局變量,賦值 */ f1( a); /* 調(diào)用函數(shù)f1( ) */ printf (“main: a=%d,b=%d”, a, b); ,f1:t1=8,t2=12,a=8,b=10 main:a=2,b=10,下一頁,第6章 函數(shù)與編譯預(yù)處理,舉例,結(jié)果,若將程序改為: #include int a=2,b=4; /*a,b為全局變量*/ void f1( ) int t1,t2; t1 = a * 2; t2 = b * 3; b = 100; printf (“t1=%d,t2=%d,b=%dn”, t1, t2
22、,b); main() int b=4; /* 此b是局部變量,賦值 */ f1( ); /* 調(diào)用函數(shù)f1( ) */ printf (“a=%d,b=%d”, a, b); ,全局變量與局部變量同名時(shí), 局部變量起作用,全局變量被 屏蔽(不影響),應(yīng)小心使用,下一頁,第6章 函數(shù)與編譯預(yù)處理,結(jié)果,t1=4,t2=12,b=100 a=2,b=4,結(jié)論,變量按存在時(shí)間分,靜態(tài)存儲(chǔ)類型的變量的生存期為程序執(zhí)行的整個(gè)過程,在該過程中占有固定的存儲(chǔ)空間,通常稱它們?yōu)橛谰么鎯?chǔ)。 動(dòng)態(tài)存儲(chǔ)類型變量只生存在某一段時(shí)間內(nèi)。例如,函數(shù)的形參和函數(shù)體或分程序中定義的變量, 只是在程序進(jìn)入該函數(shù)或分程序時(shí)才分
23、配存儲(chǔ)空間, 當(dāng)該函數(shù)或分程序執(zhí)行完后,變量對(duì)應(yīng)的存儲(chǔ)空間又被撤銷了。,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.4.2 變量的存儲(chǔ)方式,c語言中每一個(gè)變量有兩個(gè)屬性:數(shù)據(jù)類型,存儲(chǔ)特性 完整的變量定義: 存儲(chǔ)特性 數(shù)據(jù)類型 變量名;,自動(dòng)型 auto 靜態(tài)型 static 寄存器型 register 外部型 extern (1) auto型:每次進(jìn)入程序是自動(dòng)分配內(nèi)存,不長期占用內(nèi)存例如:形式參數(shù),自動(dòng)型局部變量 (2)static 型 :局部靜態(tài)變量 全局靜態(tài)變量 長期占用內(nèi)存,下一頁,第6章 函數(shù)與編譯預(yù)處理,變量的存儲(chǔ)特性,分析執(zhí)行結(jié)果 f(int a) int b=0; static i
24、nt c=3; b+;c+; printf(“%5d%5d%5d”,a,b,c); return(a+b+c); main() int a=2,k; for(k=0;k3;k+) printf(“%5dn”,f(a); ,靜態(tài)變量只初始化一次,結(jié)果: 2 1 4 (a,b,c) 7 (f(a) 2 1 5 8 2 1 6 9,下一頁,第6章 函數(shù)與編譯預(yù)處理,例如,數(shù)據(jù) 內(nèi)存 運(yùn)算器 運(yùn)算器 結(jié)果 控制器 數(shù)據(jù),寄存器變量只限于整型、字符型、指針型的局部變量。 寄存器變量是動(dòng)態(tài)變量,而且數(shù)目有限, 一般僅允許說明兩個(gè)寄存 器變量。 例如: register int d; register ch
25、ar c;,下一頁,第6章 函數(shù)與編譯預(yù)處理,(3) register型將使用頻率高的變量定義為register型, 可以提高運(yùn)行速度。,(4)extern型 引用: extern 類型 變量名; 如果某個(gè)模塊文件中要用到另一個(gè)模塊文件中的全 局變量,就要用extern說明,第6章 函數(shù)與編譯預(yù)處理,例如:程序模塊file1.c中定義了全局變量 int s ; 而在另一個(gè)程序模塊file2.c中的函數(shù)fun1( )中需要使用這個(gè)變量s。為此,可以在file2.c的函數(shù)fun1( )中加上外部變量說明語句: fun1( ) extern int s;/*表明變量s是在其他文件定義的*/ . ,定
26、義時(shí)分配內(nèi)存,其他文件引用時(shí)不再分配內(nèi)存.,返回,6.5編譯預(yù)處理,“編譯預(yù)處理”是C語言編譯系統(tǒng)的 一個(gè)組成部分。是在編譯前由編譯系統(tǒng)中的預(yù)處理程序?qū)υ闯绦虻念A(yù)處理命令進(jìn)行加工。,源程序中的預(yù)處理命令均以“#”開頭,結(jié)束不加分號(hào),以區(qū)別源程序中的語句,它們可以寫在程序中的任何位置,作用域是自出現(xiàn)點(diǎn)到源程序的末尾。 預(yù)處理命令包括執(zhí)行宏定義(宏替換)、包含文件和條件編譯。,下一頁,第6章 函數(shù)與編譯預(yù)處理,1.一般形式為: #define 宏名 串 (宏體) 如: #define PI 3.14159 /*定義后,可以用PI來代替串3.14159*/ 2.宏定義的作用: 在宏定義之后, 該程序
27、中宏名就代表了該字符串。 3.說明 可以用 #undef命令終止宏定義的作用域。例如:#undef PI 宏定義的嵌套使用 # define R 3.0 # define PI 3.1415926 # define L 2*PI*R /*宏體是表達(dá)式*/ # define S PI*R*R,下一頁,第6章 函數(shù)與編譯預(yù)處理,6.5.1 宏定義,無參宏定義,例如:main ( ) printf (L=%fnS=%fn,L,S); /*2*PI*R替換L, PI*R*R替換S */ 程序運(yùn)行結(jié)果:L=18.849556 雙引號(hào)內(nèi)與宏同名的字母不作宏展開.(見上例),帶參數(shù)的宏定義 1.帶參數(shù)的宏定
28、義的一般形式為 # define 宏名(參數(shù)表) 字符串 如:#define S (a,b) a*b #define PR (x) printf(s=%fn”, x),下一頁,第6章 函數(shù)與編譯預(yù)處理,2.帶實(shí)參的宏名被展開,下一頁,第6章 函數(shù)與編譯預(yù)處理,宏定義與函數(shù)的區(qū)別 (1) 引用宏只占編譯時(shí)間,不占運(yùn)行時(shí)間。 (2) 引用宏沒有返回值,宏名被所定義的宏體替換, 宏體中的形參按從左到右的順序被實(shí)參替換。 例如: area = S (3,2); PR(area) ; 展開為: area=3*2; PR(area) 展開的結(jié)果是: printf(s=%fn”, area) ;,#define squ(n) n*n void main (void) printf (%fn,27.0/squ(3.0); ,注意,展開為27.0/3.0*3.0 不是27.0/(3.0*3.0),程序輸出結(jié)果為: 27.000000,例如,下一頁,第6章 函數(shù)與編譯預(yù)處理,(3) 宏替換的形參無類型 (4) 實(shí)參為表達(dá)式的情況 函數(shù)調(diào)用是先計(jì)算出實(shí)參的值, 再將值傳遞給形參; 宏的引用是用表達(dá)式替換形參. 例如: #define S (a,b) a*b 引用: S(a+c,b+c
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆廣西柳州市柳江區(qū)七下數(shù)學(xué)期末聯(lián)考模擬試題含解析
- 法學(xué)概論拓展性課程的設(shè)計(jì)與實(shí)施試題及答案
- 軟件項(xiàng)目的功能需求與性能需求分析試題及答案
- 計(jì)算機(jī)組成原理考察試題及答案
- 班級(jí)工作計(jì)劃細(xì)致分工
- 倉庫工作總結(jié)提高計(jì)劃
- 江蘇省無錫市宜興市宜城環(huán)科園聯(lián)盟2025屆七下數(shù)學(xué)期末監(jiān)測(cè)試題含解析
- 外科護(hù)理團(tuán)隊(duì)建設(shè)經(jīng)驗(yàn)分享計(jì)劃
- 理財(cái)目標(biāo)規(guī)劃計(jì)劃
- 班級(jí)環(huán)境布置與主題創(chuàng)意計(jì)劃
- 廣告策劃方案-今麥郎方便面廣告策劃書
- 2024年高考真題-物理(貴州卷) 含解析
- 防返貧業(yè)務(wù)培訓(xùn)
- TSXCAS 015-2023 全固廢低碳膠凝材料應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 金融領(lǐng)域大語言模型應(yīng)用安全探析
- 父母房子以買賣方式過戶給子女買賣合同模板
- 外墻磚維修整改方案
- 2024年浙江省中考社會(huì)試卷真題(含標(biāo)準(zhǔn)答案及評(píng)分標(biāo)準(zhǔn))
- 【“李子柒”短視頻對(duì)傳統(tǒng)文化的傳播探究19000字(論文)】
- 2025屆高考作文復(fù)習(xí):讀寫結(jié)合型作文審題立意
- 你好瘋子劇本-你好瘋子話劇
評(píng)論
0/150
提交評(píng)論