c語言講義 第6章 函數(shù)存儲(chǔ)類和預(yù)處理程序_第1頁
c語言講義 第6章 函數(shù)存儲(chǔ)類和預(yù)處理程序_第2頁
c語言講義 第6章 函數(shù)存儲(chǔ)類和預(yù)處理程序_第3頁
c語言講義 第6章 函數(shù)存儲(chǔ)類和預(yù)處理程序_第4頁
c語言講義 第6章 函數(shù)存儲(chǔ)類和預(yù)處理程序_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程名稱:C語言程序設(shè)計(jì)課型與教法:講授,通過程序擴(kuò)展,進(jìn)行對比學(xué)習(xí)學(xué)時(shí):2課時(shí)授課題目:第6章函數(shù)、存儲(chǔ)類和預(yù)處理程序教學(xué)目的與要求:通過本章的學(xué)習(xí)使學(xué)生了解結(jié)構(gòu)化程序設(shè)計(jì)的思想,掌握函數(shù)的定義方法,函數(shù)的調(diào)用和參數(shù)傳遞;了解什么是嵌套調(diào)用和遞歸調(diào)用,嵌套調(diào)用和遞歸調(diào)用時(shí)程序的執(zhí)行順序,編寫簡單的遞歸函數(shù)教學(xué)難點(diǎn):形參與實(shí)參的意義、作用與區(qū)別,參數(shù)的傳遞,函數(shù)的遞歸教學(xué)重點(diǎn):函數(shù)的定義和調(diào)用;形參與實(shí)參的意義、作用與區(qū)別;參數(shù)的按值傳遞第六章函數(shù)、存儲(chǔ)類和預(yù)處理程序概述函數(shù)的定義函數(shù)的返回函數(shù)的調(diào)用參數(shù)傳遞函數(shù)的嵌套與遞歸調(diào)用變量的作用域和生命期函數(shù)的說明預(yù)處理程序函數(shù)式的程序結(jié)構(gòu)必須有且只能有一個(gè)名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用C程序設(shè)計(jì)main(){…f1();

…f2();

…}f1(){…

…}f2(){…f21();

…f22();

…}f21(){…

…}f22(){……}C程序結(jié)構(gòu)從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件函數(shù)分類

<類型標(biāo)識(shí)符><函數(shù)名>([<參數(shù)說明部分>]){ <說明部分> <語句部分>}現(xiàn)代風(fēng)格:(ANSIC格式)一般形式用戶定義的合法標(biāo)識(shí)符函數(shù)返回值類型缺省int型無返回值void函數(shù)體例有參函數(shù)(現(xiàn)代風(fēng)格)

int

max(int

x,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風(fēng)格)

int

max(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)

dummy(){}函數(shù)體為空例無參函數(shù)

printstar(){printf(“**********\n”);}或

printstar(void){printf(“**********\n”);}函數(shù)的定義可選項(xiàng)一般形式為:<類型標(biāo)識(shí)符><參數(shù)>{,<類型標(biāo)識(shí)符><參數(shù)>}函數(shù)定義不允許嵌套。

在C語言中,所有函數(shù)(包括主函數(shù)main())都是平等的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main()之前或之后。但在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。函數(shù)的定義注意:func1(){…}func2(){…}func1(){…func2(){…}…}/*嵌套定義*/

函數(shù)的返回函數(shù)執(zhí)行的最后一個(gè)操作是返回返回的意義是:使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行終結(jié),在調(diào)用期間所分配的變量單元被撤銷。送函數(shù)值到調(diào)用表達(dá)式中,但是這一點(diǎn)并非是必需的,有些函數(shù)有返回值,有些函數(shù)可以沒有返回值。從有無返回值這個(gè)角度,可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。函數(shù)的返回是通過函數(shù)中的return語句來實(shí)現(xiàn)的。返回語句功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)形式:return(表達(dá)式);或

return表達(dá)式;return;說明:函數(shù)中可有多個(gè)return語句在定義函數(shù)時(shí),對函數(shù)類型的說明應(yīng)與return語句中返回值的類型一致。若函數(shù)類型與return語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換不帶表達(dá)式的return語句位于函數(shù)體的最后時(shí),允許省略,用作函數(shù)體結(jié)束的“}”會(huì)將流程返回調(diào)用函數(shù)函數(shù)中無return語句或使用不帶表達(dá)式的return語句,并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明確表示不返回值,可以用“void”定義成“無(空)類型”------void型函數(shù)例無返回值函數(shù)

void

swap(int

x,inty){inttemp;temp=x;x=y;y=temp;}

函數(shù)的返回例:有指定返回值函數(shù)

int

max(int

k,intm){

return(k>m?k:m);}例多個(gè)return語句

int

cp(int

x,inty){if(x>y)return1;else

if(x<y)return2;return0;}

對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)說明函數(shù)說明采用函數(shù)原型方式,對被調(diào)用函數(shù)進(jìn)行說明一般形式:<類型標(biāo)識(shí)符><函數(shù)名>([<參數(shù)表列>]);作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說明函數(shù)返值是int型被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前函數(shù)說明doublefun(intn){…}main(){…fun(1);…}函數(shù)說明與定義的對應(yīng)關(guān)系main(){doublefun(intn);…fun(1);…}doublefun(intn){…}doublefun(intn);

main(){…fun(1);…}doublefun(intn){…}現(xiàn)代風(fēng)格:不需要說明:main(){…fun(1);…}int

fun(intn){…}

在程序中,是通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體的函數(shù)調(diào)用的一般形式:

<函數(shù)名>([實(shí)參表列])

說明:調(diào)用函數(shù)時(shí),函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對應(yīng),才能正確地進(jìn)行數(shù)據(jù)傳遞實(shí)參表求值順序,因系統(tǒng)而定(TurboC自右向左)C語言規(guī)定,在調(diào)用函數(shù)之前,必須有相應(yīng)的函數(shù)說明或函數(shù)定義。函數(shù)的調(diào)用函數(shù)調(diào)用語句:例:printstar();

printf(“Hello,World!\n”);函數(shù)表達(dá)式:例:m=max(a,b)*2;函數(shù)參數(shù):例:printf(“%d”,max(a,b));m=max(a,max(b,c));函數(shù)的調(diào)用

調(diào)用方式:c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個(gè)數(shù)并輸出大者/*ch6_1.cpp*/#include<stdio.h>main(){inta,b,c;

scanf("%d,%d",&a,&b);c=max(a,b);

printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;

return(z);}函數(shù)的調(diào)用

形參與實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式C語言的參數(shù)傳遞規(guī)則是按值傳遞方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值特點(diǎn):形參與實(shí)參占用不同的內(nèi)存單元單向傳遞參數(shù)傳遞

711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:/*ch6_2.cpp*/#include<stdio.h>main(){intx=7,y=11;

printf("swapped:\n");

swap(x,y);

printf("x=%d,\ty=%d\n",x,y);}swap(int

a,intb){inttemp;temp=a;a=b;b=temp;printf("a=%d,b=%d\n",a,b);}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp例交換兩個(gè)數(shù)形參實(shí)參說明:實(shí)參必須有確定的值形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同,按順序一一對應(yīng)若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放

形參與實(shí)參占用不同的內(nèi)存單元單向傳遞參數(shù)傳遞形參與實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式#include<stdio.h>

longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);

printf("a=%1d",a);}longsum(int

a,intb){longc1,c2;c1=factorial(a);c2=factorial(b);

return(c1+c2);}/*ch6_3.cpp*/

longfactorial(intn){longrtn=1;

inti;for(i=1;i<=n;i++)

rtn*=i;

return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)說明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參例子解析

數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參——值傳遞例:在main函數(shù)中有以下調(diào)用ave=fun1(a[0],a[1]);/*主函數(shù)中的調(diào)用函數(shù)語句*/….floatfun1(floata,floatb)

/*定義一個(gè)fun1函數(shù)*/{floatsum.aver;sum=a+b;aver=sum/2.0;

return(aver);}用法與變量作參數(shù)相同ba[1]aa[0]在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致形參數(shù)組大小(多維數(shù)組第一維)可不指定

形參數(shù)組名是地址變量數(shù)組作為函數(shù)參數(shù)數(shù)組名作函數(shù)實(shí)參例:/*ch6_5.cpp*/main(){voidswap(intx[2]);

inta[2]={2,9};

swap(a);printf(“%d,%d\n”,a[0],a[1]);}voidswap(intx[2]){intt;t=x[0];x[0]=x[1];x[1]=t;}a[0]2a[1]9調(diào)用前:a[0]9a[1]2調(diào)用完畢:a[0]9x[0]a[1]2x[1]交換:即把實(shí)參數(shù)組的起始地址傳給形參數(shù)組,形參數(shù)組和實(shí)參數(shù)組共占用一段內(nèi)存單元aaax

voidswap(intx[2])可寫成:voidswap(intx[])實(shí)驗(yàn)九1、輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。2、寫一函數(shù),統(tǒng)計(jì)字符串中字母的個(gè)數(shù)嵌套調(diào)用函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b

函數(shù)的嵌套與遞歸調(diào)用/*ch6_4.cpp*/#include<stdio.h>

int

dif(int

x,int

y,intz);

int

max(int

x,int

y,intz);

int

min(int

x,int

y,intz);voidmain(){inta,b,c,d;

scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);

printf("Max-Min=%d\n",d);}int

dif(int

x,int

y,intz){returnmax(x,y,z)-min(x,y,z);}int

max(int

x,int

y,intz){intr;r=x>y?x:y;return(r>z?r:z);}int

min(int

x,int

y,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)例求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說明:

C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出int

f(intx){inty,z;……

z=f(y);…….return(2*z);}int

f1(intx){inty,z;……

z=f2(y);…….return(2*z);}int

f2(intt){inta,c;……

c=f1(a);…….return(3+c);}遞歸調(diào)用

/*ch6_6.cpp*/#include<stdio.h>longfib(intn){if(n==1)return1;elseif(n==2)return1;elsereturnfib(n-1)+fib(n-2);}main(){longr;r=fib(5);printf("fib(5)=%ld",r);}例求Fibonacci數(shù)列的值遞歸調(diào)用關(guān)系示意圖mainfib(5)fib(4)fib(3)fib(3)fib(2)fib(1)fib(2)fib(2)fib(1)例求Fibonacci數(shù)列的值遞歸調(diào)用處理過程mainfib(5)fib(4)fib(3)fib(3)fib(2)fib(1)fib(2)fib(2)fib(1)112111325遞歸調(diào)用關(guān)系示意圖mainfib(5)fib(4)fib(3)fib(3)fib(2)fib(1)fib(2)fib(2)fib(1)實(shí)驗(yàn)十用函數(shù)嵌套調(diào)用的方法,計(jì)算s=1k+2k+3k+……+Nk

用遞歸法計(jì)算n!課程名稱:C語言程序設(shè)計(jì)課型與教法:講授,通過程序擴(kuò)展,進(jìn)行對比學(xué)習(xí)學(xué)時(shí):2課時(shí)授課題目:第6章函數(shù)、存儲(chǔ)類和預(yù)處理程序教學(xué)目的與要求:通過本章的學(xué)習(xí)使學(xué)生了解變量的作用域和生命期、預(yù)處理程序;能分析出程序中變量的作用范圍;會(huì)使用預(yù)處理命令#include、#define和條件編譯。教學(xué)重點(diǎn)與難點(diǎn):變量的作用域和生命期、預(yù)處理命令#include、#define概述變量是對程序中數(shù)據(jù)的存儲(chǔ)空間的抽象內(nèi)存…….main(){inta;a=10;

printf(“%d”,a);}編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元20002001變量的的作用域和生命期10程序中使用變量名對內(nèi)存操作變量的屬性數(shù)據(jù)類型:存儲(chǔ)類別:存儲(chǔ)器類型:內(nèi)存、寄存器生命期:變量占據(jù)內(nèi)存的時(shí)間期限-----靜態(tài)變量與動(dòng)態(tài)變量作用域:變量出現(xiàn)的有效區(qū)域-----局部變量與全局變量變量說明格式:<存儲(chǔ)類別><數(shù)據(jù)類型><變量表>;

變量的存儲(chǔ)類別auto-----自動(dòng)型register-----寄存器型(TurboC2.0中按自動(dòng)型處理)static------靜態(tài)型extern-----外部型變量說明的位置外部變量:在函數(shù)外部說明的變量內(nèi)部變量:在一個(gè)函數(shù)內(nèi)部說明的變量概述如:

intsum;

auto

inta,b,c;

register

inti;

staticfloatx,y;

extern

int

f,m;變量的作用域和生命期變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲(chǔ)方式靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、靜態(tài)局部變量形參變量局部動(dòng)態(tài)變量(auto,register)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等生命期靜態(tài)變量:編譯時(shí)分配存儲(chǔ)空間,從程序開始執(zhí)行直到程序結(jié)束動(dòng)態(tài)變量:函數(shù)被調(diào)用期間動(dòng)態(tài)變量與靜態(tài)變量

局部變量動(dòng)態(tài)(局部)變量靜態(tài)局部變量auto變量register變量生命期:說明該變量的函數(shù)被調(diào)用期間函數(shù)內(nèi)定義的static變量生命期:整個(gè)程序的執(zhí)行期局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,在本函數(shù)內(nèi)出現(xiàn)有效局部變量可用存儲(chǔ)類型:autoregisterstatic(默認(rèn)為auto)說明:所有函數(shù)是平行關(guān)系,main函數(shù)不例外。main中定義的變量只在main中有效,不能使用其它函數(shù)中定義的內(nèi)部變量不同函數(shù)中同名變量,占不同內(nèi)存單元C語言規(guī)定形參的存儲(chǔ)類別是自動(dòng)型,屬于局部變量可定義在復(fù)合語句中出現(xiàn)有效的變量局部變量和全局變量

floatf1(inta){registerintb,c;…….}charf2(intx,inty){staticinti,j;……}main(){intm,n;…….

{int

a,d;…….}}a,b,c有效x,y,i,j有效a,d有效m,n有效例不同函數(shù)中同名變量/*ch6_7.cpp*/#include<stdio.h>main(){inta,b;a=3;b=4;

printf("main:a=%d,b=%d\n",a,b);sub();

printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;

printf("sub:a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4局部變量---內(nèi)部變量局部變量與全局變量例auto變量/*ch6_8.cpp*/#include<stdio.h>longfactor(intn){longintf=1;f=f*n;returnf;}main(){inti;

for(i=1;i<=5;i++)

printf(“%ld\n",factor(i));}運(yùn)行結(jié)果:12345例static變量/*ch6_8_1.cpp*/#include<stdio.h>longfactor(intn){staticlongf=1;f=f*n;returnf;}main(){inti;

for(i=1;i<=5;i++)

printf(“%ld\n",factor(i));}運(yùn)行結(jié)果:12624120靜態(tài)局部變量說明:初始化語句只在第一次調(diào)用該函數(shù)時(shí)才執(zhí)行變量值具有可繼承性>全局變量---外部變量定義:在函數(shù)外面定義的變量,可被作用域內(nèi)的所有函數(shù)直接引用

外部變量可用存儲(chǔ)類型:缺省或static說明不帶存儲(chǔ)類別的外部變量說明是變量的定義性說明作用域:從變量出現(xiàn)的位置直至本文件結(jié)束生命期:整個(gè)程序執(zhí)行期在函數(shù)外面定義的static變量----靜態(tài)外部變量限定該外部變量只在本文件使用用extern說明可擴(kuò)充外部變量的作用域若外部變量與局部變量同名,則外部變量被屏蔽應(yīng)盡量少使用全局變量,因?yàn)椋喝肿兞吭诔绦蛉繄?zhí)行過程中占用存儲(chǔ)單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯(cuò)>>局部變量與全局變量

>

/*ch6_9.cpp*/#include<stdio.h>intsum;voidplusone(){sum++;}voidplustwo(){sum+=2;}main(){sum=5;

plusone();

plustwo();

printf(“Thesumis%d\n",sum);}作用域sum例子解析(1)

全局變量---外部變量

extern說明帶extern的外部變量說明是變量的引用性說明引用性說明格式:extern數(shù)據(jù)類型變量表;擴(kuò)充外部變量的作用域外部變量的定義性說明與引用性說明不同定義性說明

引用性說明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存:分配內(nèi)存,可初始化不分配內(nèi)存,不可初始化>局部變量與全局變量

intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的原作用域p,q的作用域externcharc1,c2;externcharc1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的作用范圍擴(kuò)展后例子解析(2)int

max(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;

printf("max=%d",max(a,b));}inta=13,b=-8;運(yùn)行結(jié)果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;例外部變量用于函數(shù)之間的通信

inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;

printf("max=%d",max(a,b));}運(yùn)行結(jié)果:max=8例外部變量與局部變量

靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量全局變量作用域定義變量的函數(shù)或復(fù)合語句內(nèi)本文件其它文件局部變量默認(rèn)為auto型register型變量個(gè)數(shù)受限局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲(chǔ)類別變量存儲(chǔ)類型預(yù)處理程序

作用:在編譯前對源程序進(jìn)行一些預(yù)加工,生成擴(kuò)展C源程序具體功能:宏替換#define文件包含#include條件編譯#if--#else--#endif

預(yù)處理命令說明:“#”開頭占單獨(dú)書寫行尾部不加分號(hào)可以出現(xiàn)在程序中的任何位置作用域是自出現(xiàn)點(diǎn)到程序正文結(jié)束不帶參數(shù)宏定義一般形式:#define<標(biāo)識(shí)符><字符串>功能:把程序中該宏定義之后的所有指定標(biāo)識(shí)符(宏名)用字符串(宏體)替換宏展開:預(yù)編譯時(shí),用宏體替換宏名---不作語法檢查宏體可缺省,表示宏名定義過或取消宏體定義位置:任意(一般在函數(shù)外面,文件開頭處)

作用域:從定義命令到文件結(jié)束

#undef可終止宏名作用域格式:#undef

宏名宏定義可嵌套,不能遞歸例#defineMAXMAX+10(

)引號(hào)中的內(nèi)容與宏名相同也不置換宏定義中使用必要的括號(hào)()宏替換(宏定義)例#defineMAX10

語句:

printf(“MAX”);(不置換)例#defineMAX5+10語句:k=30/MAX;結(jié)果:16例#defineP25#defineRreturn(2*P);/*源文件*/#definePI3.1416#defineR2.0doublecircum(){return(2.0*PI*R);}/*預(yù)處理后形成的源文件*/doublecircum(){return(2.0*3.1416*2.0);}宏替換宏名不能用引號(hào)括起來宏展開:形參用實(shí)參換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)()較長定義在一行寫不下,可在本行末尾使用斜杠表示要續(xù)行,注意斷開的位置

例:#definePRXprintf(“ShanxiEconomic\ManagementUniversity.”);\

printf(“\n”);一般形式:#define<標(biāo)識(shí)符>(<參數(shù)表>)<字符串>調(diào)用格式:<標(biāo)識(shí)符>(<實(shí)參表>)例#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”例

#defineS(a,b)a*b………..area=S(3,2);宏展開:

area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:z=((x+y)*(x+y));帶參數(shù)宏定義宏替換(宏定義)#defineMAX(x,y)(x)>(y)?(x):(y)…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開:t=(a+b)>(c+d)?(a+b):(c+d);int

max(int

x,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}例用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能宏替換(宏定義)帶參宏函數(shù)處理過程簡單的字符置換參數(shù)值的計(jì)算,傳遞及結(jié)果返回處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無類型問題定義實(shí)參,形參類型程序長度變長不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間帶參的宏與函數(shù)區(qū)別宏替換(宏定義)功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來一般形式:#inclu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論