版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語言程序設(shè)計(jì)
第一章程序設(shè)計(jì)基礎(chǔ)兩數(shù)求最大值的例子:main() /*主函數(shù)*/{ /*main函數(shù)體開始*/inta,b,c; /*聲明部分定義變量*/scanf(“%d,%d”,&a,&b);
c=max(a,b);/*調(diào)用max,將調(diào)用結(jié)果賦給c*/printf(“max=%d”,c);} /*main函數(shù)體結(jié)束*/intmax(intx,inty) /*計(jì)算兩數(shù)中較大數(shù)的函數(shù)*/{ /*max函數(shù)體開始*/intz; /*聲明部分,定義變量*/if(x>y)z=x;elsez=y;returnz; /*將z值返回,通過max帶回調(diào)用處*/} /*max函數(shù)體結(jié)束*/程序設(shè)計(jì)的藝術(shù)程序設(shè)計(jì)有兩大最高級(jí)的藝術(shù)算法設(shè)計(jì)藝術(shù)結(jié)構(gòu)設(shè)計(jì)藝術(shù)函數(shù)(function)是結(jié)構(gòu)設(shè)計(jì)的最基本單位“一個(gè)程序應(yīng)該是輕靈自由的,它的子過程(函數(shù))就象串在一根線上的珍珠。”GeoffreyJames的《編程之道》數(shù)學(xué)函數(shù)(1)自變量因變量函數(shù)規(guī)則函數(shù)結(jié)果(返回值)函數(shù)名參數(shù)
C語言程序設(shè)計(jì)
第一章程序設(shè)計(jì)基礎(chǔ)兩數(shù)求最大值的例子:main() /*主函數(shù)*/{ /*main函數(shù)體開始*/inta,b,c; /*聲明部分定義變量*/scanf(“%d,%d”,&a,&b);
c=max(a,b);/*調(diào)用max,將調(diào)用結(jié)果賦給c*/printf(“max=%d”,c);} /*main函數(shù)體結(jié)束*/intmax(intx,inty) /*計(jì)算兩數(shù)中較大數(shù)的函數(shù)*/{ /*max函數(shù)體開始*/intz; /*聲明部分,定義變量*/if(x>y)z=x;elsez=y;returnz; /*將z值返回,通過max帶回調(diào)用處*/} /*max函數(shù)體結(jié)束*/第六章函數(shù)6.1.1
概述模塊化程序設(shè)計(jì)一個(gè)C程序可由一個(gè)主函數(shù)(main()函數(shù))和若干個(gè)功能函數(shù)共同構(gòu)成基本思想:把程序所實(shí)現(xiàn)的不同功能,分別寫成不同的功能函數(shù),用到哪個(gè)功能就調(diào)用哪個(gè).各函數(shù)之間的調(diào)用關(guān)系如下:由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,但不能調(diào)用主函數(shù)。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單符合結(jié)構(gòu)化設(shè)計(jì)思想,便于設(shè)計(jì),調(diào)試和擴(kuò)充控制了程序設(shè)計(jì)的復(fù)雜性提高程序的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充C各函數(shù)之間的關(guān)系一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成;源程序文件是編譯單位C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用了其它函數(shù)后返回main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。調(diào)用者稱主調(diào)函數(shù),被調(diào)用者稱被調(diào)函數(shù)所有函數(shù)都是平行的,不能嵌套定義.函數(shù)間可以互相調(diào)用,但是不能調(diào)用主函數(shù).C程序結(jié)構(gòu)源程序文件1預(yù)編譯命令說明部分執(zhí)行部分函數(shù)1函數(shù)n源程序文件i源程序文件nC程序函數(shù)分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從有無返回值有返回值無返回值從函數(shù)形式無參函數(shù)有參函數(shù)6.2函數(shù)定義(definition)返回值類型
函數(shù)名(類型參數(shù)1,類型參數(shù)2,……
)
{
函數(shù)體
return
表達(dá)式;
}說明:C語言規(guī)定不能在函數(shù)內(nèi)部再定義其它函數(shù),即不能嵌套定義。當(dāng)函數(shù)執(zhí)行到return語句時(shí),程序流程就中止函數(shù)的執(zhí)行,返回到主調(diào)函數(shù)調(diào)用它的地方函數(shù)內(nèi)部定義的變量只能自己使用,稱內(nèi)部變量。
參數(shù)表里形參的變量也是屬于內(nèi)部變量函數(shù)的返回值是通過函數(shù)中的return
語句獲得的。
C語言程序設(shè)計(jì)
第一章程序設(shè)計(jì)基礎(chǔ)兩數(shù)求最大值的例子:main() /*主函數(shù)*/{ /*main函數(shù)體開始*/inta,b,c; /*聲明部分定義變量*/scanf(“%d,%d”,&a,&b);
c=max(a,b);/*調(diào)用max,將調(diào)用結(jié)果賦給c*/printf(“max=%d”,c);} /*main函數(shù)體結(jié)束*/intmax(intx,inty) /*計(jì)算兩數(shù)中較大數(shù)的函數(shù)*/{ /*max函數(shù)體開始*/intz; /*聲明部分,定義變量*/if(x>y)z=x;elsez=y;returnz; /*將z值返回,通過max帶回調(diào)用處*/} /*max函數(shù)體結(jié)束*/計(jì)算兩個(gè)整數(shù)的平均數(shù)/*
函數(shù)功能:計(jì)算平均數(shù)函數(shù)入口參數(shù):整型x,存儲(chǔ)第一個(gè)運(yùn)算數(shù)整型y,存儲(chǔ)第二個(gè)運(yùn)算數(shù)函數(shù)返回值:平均數(shù)*/intAverage(intx,inty){
intresult; result=(x+y)/2;
returnresult;}6.2.2
函數(shù)的參數(shù)和返回值函數(shù)的形參和實(shí)參實(shí)際參數(shù):在主調(diào)函數(shù)中去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中的參數(shù)
形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括弧中的變量說明:在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),形參并不占內(nèi)存中的存儲(chǔ)單元,只有發(fā)生函數(shù)調(diào)用時(shí),形參才被分配內(nèi)存單元。調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放實(shí)參可以是常量,變量或表達(dá)式。調(diào)用時(shí),實(shí)參的值必須確定實(shí)參和形參的類型應(yīng)相同或者賦值兼容實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是單向值傳遞。下一頁(yè)c=max(a,b);(main函數(shù))(max函數(shù))intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參上一頁(yè)711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:例交換兩個(gè)數(shù)#include<stdio.h>voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");
swap(x,y);printf("x=%d,\ty=%d\n",x,y);}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp§6.2.5數(shù)組作為函數(shù)參數(shù)1、一維數(shù)組元素作為函數(shù)參數(shù)(普通變量)一維數(shù)組中元素作為函數(shù)的實(shí)參,與同類型的簡(jiǎn)單變量作為實(shí)參效果一樣,是單向的值傳遞,即數(shù)組元素的值傳給形參,形參的改變不影響實(shí)參。
例:數(shù)組元素值能否交換?#include<stdio.h>
voidchange(intx,inty)
{intt;t=x;x=y;y=t;}
voidmain()
{inta[2];scanf("%d,%d",&a[0],&a[1]);change(a[0],a[1]);printf("%d,%d\n",a[0],a[1]);}例2、數(shù)組名作為函數(shù)參數(shù)(傳遞數(shù)組首地址)數(shù)組名作為函數(shù)參數(shù),此時(shí)形參和實(shí)參都是數(shù)組名(或者是表示地址的指針變量,指針講),傳遞的是整個(gè)數(shù)組,即形參數(shù)組和實(shí)參數(shù)組完全等同,是存放在同一空間的同一個(gè)數(shù)組。這樣形參數(shù)組修改時(shí),實(shí)參數(shù)組也同時(shí)被修改了。#include<stdio.h>voidchange(intb[]){ intt;t=b[0];b[0]=b[1];b[1]=t;}voidmain(){inta[2];scanf("%d,%d",&a[0],&a[1]);change(a);printf("%d,%d\n",a[0],a[1]);}例數(shù)組名作函數(shù)參數(shù)時(shí)要注意:形參中的數(shù)組要定義,并且要求與實(shí)參數(shù)組類型一致,但是形參數(shù)組的大?。丛貍€(gè)數(shù))在編譯的時(shí)候不起任何作用,系統(tǒng)也不對(duì)數(shù)組大小進(jìn)行檢查,所以形參數(shù)組的元素個(gè)數(shù)可以省略,而由一個(gè)專門的參數(shù)傳遞元素個(gè)數(shù)。例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較12a調(diào)用前a[0]a[1]12a調(diào)用a[0]a[1]12xy21xy交換12a返回#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};
swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞12a調(diào)用前12ax調(diào)用21ax交換21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};
swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較例求學(xué)生的平均成績(jī)#include<stdio.h>
floataverage(intstu[],intn);
voidmain(){intscore[10],i;floatave;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);ave=average(score,10);printf("Averageis:%.2f",ave);}floataverage(intstu[],intn){inti;floatave,total=0;for(i=0;i<n;i++)total+=stu[i];ave=total/n;returnave;}實(shí)參用數(shù)組名..2109score562312….….88stu2、函數(shù)的返回值:通過函數(shù)調(diào)用使得主調(diào)函數(shù)得到一個(gè)確定的值,就是函數(shù)返回值。函數(shù)返回值的類型和函數(shù)定義時(shí)的類型應(yīng)該保持一致。函數(shù)的返回值是通過函數(shù)中的return語句獲得。返回語句:形式:
return(表達(dá)式);
或
return表達(dá)式;
或
return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)說明:一個(gè)函數(shù)中允許有多個(gè)return語句函數(shù)首部的所定義的函數(shù)類型應(yīng)盡量與return返回值類型一致用void定義無返回值的函數(shù),函數(shù)內(nèi)應(yīng)無return語句函數(shù)調(diào)用(call)有返回值時(shí)放到一個(gè)表達(dá)式中如:c=max(a,b);作為另一個(gè)函數(shù)調(diào)用的參數(shù)如
c=max(max(a,b),c);printf("%d\n",max(a,b));無返回值時(shí)函數(shù)調(diào)用表達(dá)式如:display(a,b);返回值例函數(shù)返回值類型轉(zhuǎn)換max(floatx,floaty){floatz;z=x>y?x:y;return(z);}voidmain(){floata,b;intc;scanf("%f,%f",&a,&b);printf("%f,%f\n",a,b);c=max(a,b);printf("Maxis%d\n",c);}為了明確表示“不帶回值”,可以給函數(shù)定義時(shí)用“void”定義。例無返回值函數(shù)
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}函數(shù)聲明和原型對(duì)被調(diào)用函數(shù)要求:庫(kù)函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)聲明函數(shù)聲明一般形式:函數(shù)類型函數(shù)名(形參類型1形參名1,..);
或函數(shù)類型函數(shù)名(形參類型1,形參類型2,…);作用:告訴編譯系統(tǒng)函數(shù)類型、函數(shù)名及參數(shù)類型,以便檢驗(yàn)函數(shù)定義與函數(shù)聲明不同函數(shù)定義:定義函數(shù)的完整功能模塊函數(shù)聲明:有助于編譯器進(jìn)行函數(shù)類型、函數(shù)名及參數(shù)類型檢查函數(shù)聲明位置:所有函數(shù)定義之前或者主調(diào)函數(shù)中。main(){floata,b,c;scanf("%f,%f",&a,&b);
c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd(float,float);注意
調(diào)用一個(gè)函數(shù)之前,先要對(duì)其返回值類型、函數(shù)名和參數(shù)進(jìn)行聲明(declare)有助于編譯器進(jìn)行類型檢查floatadd(floatx,floaty);
/*functiondeclaration*/#include<stdio.h>main(){ inta=12; intb=24; ave=Average(a,b);
printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty){
intresult; result=(x+y)/2;
returnresult;}函數(shù)定義寫在主調(diào)函數(shù)前#include<stdio.h>main(){
inta=12;
intb=24; ave=Average(a,b);
printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty){
intresult; result=(x+y)/2;
returnresult;}函數(shù)定義寫在主調(diào)函數(shù)后intAverage(intx,inty);/*聲明Average()函數(shù)*/intAverage(intx,inty);/*聲明Average()函數(shù)*/例函數(shù)說明舉例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}被調(diào)函數(shù)類型為整形,可以在函數(shù)調(diào)用前不必做函數(shù)聲明,系統(tǒng)自動(dòng)用:intmax();來檢查只不過無法對(duì)參數(shù)的類型做檢查。6.4
函數(shù)的調(diào)用調(diào)用一般形式函數(shù)名(實(shí)參表);說明:實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng)實(shí)參表求值順序,因系統(tǒng)而定(TurboC,C++自右向左)intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,++i);
printf("%d\n",p);}例參數(shù)求值順序運(yùn)行結(jié)果:0調(diào)用方式函數(shù)語句:例printf(“Hello,World!\n”);函數(shù)表達(dá)式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));課堂作業(yè):寫出如下程序輸出結(jié)果:#include<stdio.h>intfun(intn1,intn2){if(n1>n2)returnn1;returnn2;}voidmain(){intn1=2,n2=3;printf(“result=%d\n”,fun(n1++,n2+=2));printf(“result=%d\n”,fun(n2+n1,n1=1));}6.2.6
函數(shù)的嵌套與遞歸調(diào)用嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main(){……a();}a
函數(shù){b();…return;}b函數(shù){……return;}①③④⑤⑥⑦②例輸入三個(gè)數(shù),求其中最大數(shù)和最小數(shù)的差值#include<stdio.h>
intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,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ù)遞歸調(diào)用遞歸調(diào)用:C語言的函數(shù)調(diào)用允許直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。遞歸調(diào)用函數(shù)的使用可以解決具有遞歸性質(zhì)的問題。f()調(diào)f調(diào)f2調(diào)f1f1()f2()intf(intx){inty,z;……
z=f(y);…….return(2*z);}intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}例:有5個(gè)人坐在一起,問第5個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大2歲。問第3個(gè)人,又說比第2個(gè)人大2歲。問第2個(gè)人,說比第1個(gè)人大2歲。最后問第1個(gè)人,他說是10歲。問第5個(gè)人多大?age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10#include<stdio.h>intage(intn){intc;
if(n==1)c=10;elsec=age(n-1)+2;return(c);}main(){printf("%d",age(5));}注意:遞歸調(diào)用必須可以滿足一定條件時(shí)結(jié)束遞歸調(diào)用,否則無限地遞歸調(diào)用將導(dǎo)致程序無法結(jié)束。例求n的階乘#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}說明C編譯系統(tǒng)對(duì)遞歸函數(shù)的調(diào)用次數(shù)沒有限制。每調(diào)用函數(shù)一次,需在內(nèi)存棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起棧溢出。遞歸是一種非常有效的數(shù)學(xué)方法,也是程序設(shè)計(jì)的重要算法。對(duì)于某些問題的處理,采用遞歸方法效果明顯,但遞歸也需占用大量的時(shí)間和額外內(nèi)存,在確定算法之前應(yīng)綜合考慮是否選用遞歸方法。intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}局部變量與全局變量局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義的變量(包括形參)或者在復(fù)合語句塊內(nèi)部定義的變量特點(diǎn):并列函數(shù)模塊各自定義的變量包括同名變量互不干擾當(dāng)發(fā)生函數(shù)調(diào)用,進(jìn)入函數(shù)模塊時(shí)局部變量才分配內(nèi)存,僅能由函數(shù)模塊內(nèi)操作語句訪問,退出函數(shù)時(shí)釋放內(nèi)存,不再有效定義局部變量時(shí)其不會(huì)自動(dòng)初始化,需要程序員指定初值floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例復(fù)合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}例不同函數(shù)中同名變量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);}voidsub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}變量的作用域:全局變量---外部變量定義:在所有函數(shù)之外定義的變量特點(diǎn):在程序中從定義它的位置開始到整個(gè)程序結(jié)束都有效,它屬于它所在的源文件,在某一函數(shù)中對(duì)全局變量所做的改變,也會(huì)影響其他函數(shù)中這個(gè)變量的值。從程序運(yùn)行起就開辟內(nèi)存空間,程序運(yùn)行過程中可隨時(shí)訪問并一直有效,直到程序全部結(jié)束才釋放內(nèi)存使函數(shù)之間的數(shù)據(jù)交換更容易,也更高效但是并不推薦使用,盡量少用。因?yàn)檎l都可以改寫全局變量,所以很難確定是誰改寫了它在定義點(diǎn)之前或在其他文件中引用,應(yīng)該進(jìn)行如下聲明:extern類型名變量名;intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}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ò)展后inta=6,b=10;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=15;printf(“max=%d”,max(a,b));}若外部變量與局部變量同名,則外部變量被屏蔽,僅內(nèi)部變量有效intvs(intl,intw){externinth;intv;v=l*w*h;returnv;}voidmain(){externintw,h;intl=5;printf("v=%d",vs(l,w));}intl=3,w=4,h=5;變量的存儲(chǔ)類別:指數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式即編譯器為變量分配內(nèi)存的方式,它決定變量的生存期動(dòng)態(tài)存儲(chǔ)方式:根據(jù)需要臨時(shí)分配存儲(chǔ)空間,離開即釋放靜態(tài)存儲(chǔ)方式:在程序運(yùn)行整個(gè)期間分配固定的存儲(chǔ)空間不釋放(全局變量)變量完整的定義格式:
[存儲(chǔ)類型]
數(shù)據(jù)類型變量名;變量的存儲(chǔ)類型auto-----自動(dòng)型register-----寄存器型static------靜態(tài)型extern-----外部型6.4
變量的存儲(chǔ)類別及生命周期程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)形參、自動(dòng)變量、函數(shù)調(diào)用的現(xiàn)場(chǎng)等全局變量、靜態(tài)變量函數(shù)中的形參函數(shù)內(nèi)定義的局部變量函數(shù)內(nèi)復(fù)合語句定義的變量“自動(dòng)”體現(xiàn)在:進(jìn)入函數(shù)模塊時(shí)自動(dòng)申請(qǐng)內(nèi)存,退出時(shí)自動(dòng)釋放
intf(inta){
autointb,c=3;}注意:關(guān)鍵字”auto”可省,隱含為”自動(dòng)存儲(chǔ)類別”,它屬于動(dòng)態(tài)存儲(chǔ)方式.程序中大多數(shù)局部變量屬于自動(dòng)變量.auto變量:函數(shù)當(dāng)中的局部變量,定義時(shí)使用auto或者沒有指定存儲(chǔ)類型時(shí),稱自動(dòng)變量。等價(jià)于intb,c=3;寄存器變量(register)寄存器:CPU的內(nèi)部容量很有限、但速度極快的存儲(chǔ)器什么變量可定義為寄存器變量?只有局部自動(dòng)變量和形參可以作為寄存器變量,其它(如全局變量)不行.使用頻率比較高的變量聲明為register,可以使程序更小、執(zhí)行速度更快現(xiàn)代編譯器有能力自動(dòng)把普通變量?jī)?yōu)化為寄存器變量,并且可以忽略用戶的指定,所以一般無需特別聲明變量為registermain(){longintsum=0;floatave;
registerinti;
for(i=1;i<=2000;i++)sum+=i;ave=sum/2000.0;printf(“sum=%ld\n”,sum);printf(“ave=%f\n”,ave);}靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元,在程序整個(gè)運(yùn)行期間都不釋放.對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值.定義靜態(tài)局部變量時(shí)不賦初值,編譯時(shí)自動(dòng)賦初值為0雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其它函數(shù)是不能引用它的.static變量:fun(inta){intb=0;
staticintc=0;b++;c=c+b;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,fun(a));}main(){voidincrement();increment();increment();increment();}voidincrement(){intx=0;x++;printf(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運(yùn)行結(jié)果:111main(){voidincrement();increment();increment();increment();}voidincrement(){staticintx=0;x++;printf(“%d\n”,x);}運(yùn)行結(jié)果:1231.在一個(gè)文件內(nèi)聲明外部變量extern變量: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ò)展后intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externintA,B;printf(“%d”,max(A,B));}intA=13,B=-8;2.在多文件的程序中聲明外部變量extern變量:例引用其它文件中的外部變量intglobal;externfloatx;main(){intlocal; . . .}externintglobal;staticintnumber;func2(){ . . .}floatx;staticintnumber;func3(){externintglobal; . . .}file1.cfile2.cfile3.c6.5外部函數(shù)和內(nèi)部函數(shù)1內(nèi)部函數(shù)定義:如果一個(gè)函數(shù)只能被本文件中其它函數(shù)調(diào)用,稱為內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))。格式:static類型標(biāo)識(shí)符函數(shù)名(形參表)例如:staticintfun(inta,intb){..….}作用:函數(shù)的作用域限于所在文件,不同文件中同名函數(shù)互不干擾,便于程序的局部化。2外部函數(shù)定義:如果一個(gè)函數(shù)允許被其它文件調(diào)用,稱為外部函數(shù)。格式:extern類型標(biāo)識(shí)符函數(shù)名(形參表)例如:externintfun(inta,intb){..….}intfun(inta,intb){..….}或
類型標(biāo)識(shí)符函數(shù)名(形參表)或通常不加static標(biāo)識(shí)符的函數(shù)都是外部函數(shù)。例文件file1.cinta;main(){…….…….f2();…….f1();…….}f1(){autointb;………f2();……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:一、編譯預(yù)處理的概念
預(yù)處理部分都是放在函數(shù)之外和程序的開始,它是程序編譯時(shí)首先要做的工作,編譯系統(tǒng)對(duì)源程序中的預(yù)處理部分做處理,結(jié)束后才進(jìn)入源程序的編譯.二、主要預(yù)處理種類⑴文件包含(#include);⑵宏定義(#define);⑶條件編譯6.6編譯預(yù)處理
6.6.1文件包含命令
“文件包含”:是指一個(gè)源文件可以將另外一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來。C語言提供#include命令來實(shí)現(xiàn)“文件包含”的操作,其一般形式為:
#include“文件名”
#include<文件名>或作用:可以節(jié)省程序設(shè)計(jì)人員的重復(fù)勞動(dòng)在使用編譯預(yù)處理#include命令時(shí),需要注意的幾個(gè)問題如下:(1) 一個(gè)#include命令只能指定一個(gè)被包含的文件,如果要包含n個(gè)文件,要用n個(gè)#include命令(2) 在一個(gè)被包含文件中又可以包含另一個(gè)文件,文件包含可以嵌套使用,即被包括的文件中還可以使用#include語句。(3) 在#include命令中,文件名可以用雙引號(hào)或尖括號(hào)
二者區(qū)別:#include“文件名”直接到系統(tǒng)指定的標(biāo)準(zhǔn)目錄(存放庫(kù)函數(shù)文件)中去查找(標(biāo)準(zhǔn)方式)。#include<文件名>先在用戶當(dāng)前源程序文件所在工作目錄中去查找,若找不到再到指定的標(biāo)準(zhǔn)目錄中去查找
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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年通榆縣事業(yè)單位考試真題
- 2025年北京市房山區(qū)法院系統(tǒng)招聘真題
- 北京市石景山區(qū)2025-2026學(xué)年高二上學(xué)期期末考試歷史試卷(含答案)
- 2026中國(guó)科學(xué)院高能物理研究所科研計(jì)劃處副處長(zhǎng)崗位招聘1人備考題庫(kù)及答案詳解(新)
- 2026廣西北海市海城區(qū)海洋局招聘編外人員1人備考題庫(kù)完整參考答案詳解
- 2026年度建行研修中心東北研修院社會(huì)招聘1人備考題庫(kù)及一套參考答案詳解
- XX工程職業(yè)技術(shù)學(xué)院用火用電消防安全管理制度
- 從業(yè)人員個(gè)人衛(wèi)生管理制度
- 2026年公共英語六級(jí)考試練習(xí)題閱讀理解與寫作技巧
- 2026年市場(chǎng)營(yíng)銷策略與市場(chǎng)調(diào)研方法綜合練習(xí)題
- 2026年鄉(xiāng)村醫(yī)生傳染病考試題含答案
- 金屬?gòu)S生產(chǎn)制度
- 2026安徽淮北市特種設(shè)備監(jiān)督檢驗(yàn)中心招聘專業(yè)技術(shù)人員4人參考題庫(kù)及答案1套
- 新零售模式下人才培養(yǎng)方案
- 上海市徐匯區(qū)2026屆初三一模化學(xué)試題(含答案)
- 2025年航空行業(yè)空客智能制造報(bào)告
- 預(yù)中標(biāo)協(xié)議書電子版
- 龜?shù)慕馄收n件
- 蒙牛乳業(yè)股份有限公司盈利能力分析
- 2025民航西藏空管中心社會(huì)招聘14人(第1期)筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- (新教材)2026年人教版八年級(jí)下冊(cè)數(shù)學(xué) 21.2.1 平行四邊形及其性質(zhì) 課件
評(píng)論
0/150
提交評(píng)論