函數(shù)和預(yù)處理辦法_第1頁
函數(shù)和預(yù)處理辦法_第2頁
函數(shù)和預(yù)處理辦法_第3頁
函數(shù)和預(yù)處理辦法_第4頁
函數(shù)和預(yù)處理辦法_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

函數(shù)和預(yù)處理辦法4.1概述模塊化程序設(shè)計基本思想:將一個大的程序按功能分割成一些小模塊特點:各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護(hù)和功能擴(kuò)充開發(fā)方法:自上向下,逐步分解,分而治之一個程序中函數(shù)調(diào)用的示意圖。例4.1在主函數(shù)中調(diào)用其他函數(shù)。#include<iostream>usingnamespacestd;voidprintstar(void){cout<<″******************************″<<endl;}voidprint_message(void){cout<<″WelcometoC++!″<<endl;}intmain(void){printstar();//調(diào)用printstar函數(shù)

print_message();//調(diào)用print_message函數(shù)printstar();//調(diào)用printstar函數(shù)return0;}運(yùn)行情況如下:******************************

WelcometoC++!******************************C++是模塊化程序設(shè)計語言C++是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C++程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用主函數(shù)以外的函數(shù)大多是被封裝在類中的函數(shù)分類從用戶角度標(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、需要使用的包含文件4.2定義函數(shù)的一般形式一般格式合法標(biāo)識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){

說明部分 語句部分}例有參函數(shù)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)

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

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

voidprintstar(void){cout<<″******************************″<<endl;}voidprint_message(void){cout<<″WelcometoC++!″<<endl;}說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放4.3函數(shù)參數(shù)和函數(shù)的值形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式例:計算x的立方#include<iostream>usingnamespacestdfloatcube(floatx){return(x*x*x);}intmain(){floata,product;cout<<"Pleaseinputvalueofa:";cin>>a;product=cube(a);cout<<"Cubeof"<<a<<"is"<<product<<endl;return0;}xaproduct××××28例4.2調(diào)用函數(shù)時的數(shù)據(jù)傳遞。#include<iostream>usingnamespacestd;intmax(intx,inty){intz;z=x>y?x:y;return(z);}intmain(){inta,b,c;cout<<″請輸入兩個整數(shù):″;cin>>a>>b;c=max(a,b);cout<<″max=″<<c<<endl;return0;}c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個數(shù)并輸出大者#include<iostream>usingnamespacestd;int

main(){inta,b,c;intmax(intx,inty);

cin>>a>>b;c=max(a,b);cout<<"Maxis”<<c<<endl;return0;}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參實參運(yùn)行情況如下:pleaseentertwointegernumbers:23↙max=3參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:例交換兩個數(shù)#include<iostream>usingnamespacestd;intmain(){intx=7,y=11;voidsa,intb);

//cin>>x>>y;cout<<"s:\n“<<endl;s);cout<<x<<y<<endl;}voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp函數(shù)的返回值返回語句形式:return(表達(dá)式);或return表達(dá)式;或return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇}時,自動返回主調(diào)用函數(shù)若函數(shù)類型與return語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)例無返回值函數(shù)

voidsx,inty){inttemp;temp=x;x=y;y=temp;}例:函數(shù)返回值類型轉(zhuǎn)換#include<iostream>usingnamespacestd;intmax(floatx,floaty){floatz;z=x>y?x:y;return(z);}intmain(){floata,b;intc;cin>>a>>b;c=max(a,b);cout<<"Maxis"<<c<<endl;return0;}運(yùn)行結(jié)果:2.6,8.9

Maxis84.4函數(shù)的調(diào)用函數(shù)調(diào)用一般形式函數(shù)名([實參表列]);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)實參表求值順序,因系統(tǒng)而定(TurboC自右向左)函數(shù)調(diào)用方式函數(shù)語句:例printstar();函數(shù)表達(dá)式:例m=max(a,b)*2;函數(shù)參數(shù):例m=max(a,max(b,c));函數(shù)說明對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明函數(shù)說明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);

或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說明若函數(shù)返回值是char或int型,系統(tǒng)自動按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前例函數(shù)說明舉例#include<iostream>usingnamespacestd;int

main(){inta,b;intc;cin>>a>>b;c=max(a,b);cout<<"Maxis“<<c<<endl;return0;}max(intx,inty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)#include<iostream>usingnamespacestd;floatadd(floatx,floaty){floatz;z=x+y;return(z);}intmain(){floata,b,c;cin>>a>>b;c=add(a,b);cout<<"sumis“<<c<<endl;return0;}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明#include<iostream>usingnamespacestd;intmain(){floatadd(float,float);/*functiondeclaration*/floata,b,c;cin>>a>>b;c=add(a,b);cout<<"sumis“<<c<<endl;return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();#include<iostream>usingnamespacestd;longsum(inta,intb);longfactorial(intn);voidmain(){intn1,n2;longa;cin>>n1>>n2;a=sum(n1,n2);cout<<a;}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);}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ù)返回值形參實參調(diào)用函數(shù)時需要一定的時間和空間的開銷。下圖表示函數(shù)調(diào)用的過程:4.5內(nèi)置函數(shù)內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù))

在編譯時將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去。指定內(nèi)置函數(shù),只需在函數(shù)首行的左端加一個關(guān)鍵字inline。例4.4函數(shù)指定為內(nèi)置函數(shù)。#include<iostream>usingnamespacestd;inlineintmax(int,int,int);//函數(shù)聲明,注意左端有inlineintmain(){inti=10,j=20,k=30,m;m=max(i,j,k);cout<<″max=″<<m<<endl;return0;}inlineintmax(inta,intb,intc)//定義max為內(nèi)置函數(shù){if(b>a)a=b;//求a,b,c中的最大者

if(c>a)a=c;returna;}實參代替形參,被置換成if(j>i)i=j;if(k>i)i=k;m=i;注意:inline可以寫在聲明函數(shù)或定義函數(shù)時優(yōu)點:內(nèi)置函數(shù)節(jié)省運(yùn)行時間缺點:增加了目標(biāo)程序的長度。對內(nèi)置函數(shù)的要求:規(guī)模很小,一般為5個語句以下使用頻繁的函數(shù)不包括復(fù)雜的控制語句,如循環(huán)語句和switch語句函數(shù)的重載:一組概念相同,處理對象(參數(shù))不同的過程,出于方便編程的目的,用同一個函數(shù)名字來命名的技術(shù)稱為函數(shù)重載重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨函數(shù)體可以相同也可以不同4.6函數(shù)的重載例: voidprint(double); voidprint(int); voidfunc() { print(1); //voidprint(int); print(1.0); //voidprint(double); print(‘a(chǎn)’); //voidprint(int); print(3.1415f); //voidpirnt(double); }例4.5求3個數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、長整數(shù)的情況)。#include<iostream>usingnamespacestd;intmain(){intmax(inta,intb,intc);//函數(shù)聲明doublemax(doublea,doubleb,doublec);//函數(shù)聲明longmax(longa,longb,longc);//函數(shù)聲明

inti1,i2,i3,i;cin>>i1>>i2>>i3;//輸入3個整數(shù)

i=max(i1,i2,i3);//求3個整數(shù)中的最大者

cout<<″i_max=″<<i<<endl;

doubled1,d2,d3,d;cin>>d1>>d2>>d3;d=max(d1,d2,d3);cout<<″d_max=″<<d<<endl;longg1,g2,g3,g;cin>>g1>>g2>>g3;g=max(g1,g2,g3);cout<<″g_max=″<<g<<endl;return0;}intmax(inta,intb,intc){if(b>a)a=b;if(c>a)a=c;returna;}doublemax(doublea,doubleb,doublec){if(b>a)a=b;if(c>a)a=c;returna;}longmax(longa,longb,longc){if(b>a)a=b;if(c>a)a=c;returna;}運(yùn)行情況如下:185-76567↙i_max=56756.8790.23-3214.78↙d_max=90.2367854-912456673456↙g_max=673456

例4.6參數(shù)個數(shù)不同。

#include<iostream>usingnamespacestd;intmain(){intmax(inta,intb,intc);//函數(shù)聲明

intmax(inta,intb);//函數(shù)聲明

inta=8,b=-12,c=27;cout<<“max(a,b,c)=“<<max(a,b,c)<<endl;cout<<“max(a,b)=“<<max(a,b)<<endl;return0;}intmax(inta,intb,intc){if(b>a)a=b;if(c>a)a=c;returna;}intmax(inta,intb){if(a>b)returna;elsereturnb;}運(yùn)行情況如下:max(a,b,c)=27max(a,b)=8兩次調(diào)用max函數(shù)的參數(shù)個數(shù)不同,系統(tǒng)就根據(jù)參數(shù)的個數(shù)找到與之匹配的函數(shù)并調(diào)用它。定義函數(shù)模板的形式:

template<typenameT>或template<classT>

通用函數(shù)定義通用函數(shù)定義在調(diào)用函數(shù)時系統(tǒng)會根據(jù)實參的類型來取代模板中的虛擬類型,從而實現(xiàn)了不同函數(shù)的功能。類型參數(shù)可以不只一個,可以根據(jù)需要確定個數(shù)。如:template<classT1,typenameT2>注意:

它只適用于函數(shù)的參數(shù)個數(shù)相同而類型不同,且函數(shù)體相同的情況,如果參數(shù)的個數(shù)不同,則不能用函數(shù)模板。4.7函數(shù)模板例4.7將例4.6程序改為通過函數(shù)模板來實現(xiàn)。

#include<iostream>usingnamespacestd;template<typenameT>//模板聲明,其中T為類型參數(shù)Tmax(Ta,Tb,Tc){if(b>a)a=b;if(c>a)a=c;returna;}intmain(){inti1=185,i2=-76,i3=567,i;doubled1=56.87,d2=90.23,d3=-3214.78,d;longg1=67854,g2=-912456,g3=673456,g;i=max(i1,i2,i3);d=max(d1,d2,d3);g=max(g1,g2,g3);cout<<″i_max=″<<i<<endl;cout<<″f_max=″<<f<<endl;cout<<″g_max=″<<g<<endl;return0;}intmax(inta,intb,intc){if(b>a)a=b;if(c>a)a=c;returna;}函數(shù)在聲明時可以預(yù)先給出默認(rèn)的形參值,調(diào)用時如給出實參,則采用實參值,否則采用預(yù)先給出的默認(rèn)形參值。例如:4.8有默認(rèn)參數(shù)的函數(shù)intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因為調(diào)用時實參取代形參是從左向右的順序。例:intadd(intx,inty=5,intz=6);//正確intadd(intx=1,inty=5,intz); //錯誤intadd(intx=1,inty,intz=6); //錯誤調(diào)用出現(xiàn)在函數(shù)體定義之前時,默認(rèn)形參值必須在函數(shù)原型中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體定義之后時,默認(rèn)形參值需在函數(shù)定義時給出。例:intadd(intx=5,inty=6);voidmain(void){add();//調(diào)用在定義前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}voidmain(void){add();//調(diào)用在定義后}例4.8求2個或3個正整數(shù)中的最大數(shù),用帶有默認(rèn)參數(shù)的函數(shù)實現(xiàn)。#include<iostream>usingnamespacestd;intmain(){intmax(inta,intb,intc=0);inta,b,c;cin>>a>>b>>c;cout<<″max(a,b,c)=″<<max(a,b,c)<<endl;cout<<″max(a,b)=″<<max(a,b)<<endl;//c取默認(rèn)值return0;}intmax(inta,intb,intc){if(b>a)a=b;if(c>a)a=c;returna;}運(yùn)行情況如下:14-56135↙max(a,b,c)=135max(a,b)=14在相同的作用域內(nèi),默認(rèn)形參值的說明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說明不同的默認(rèn)形參。例:intadd(intx=1,inty=2);voidmain(void){intadd(intx=3,inty=4);add(); //使用局部默認(rèn)形參值(實現(xiàn)3+4)}voidfun(void){...add();//使用全局默認(rèn)形參值(實現(xiàn)1+2)}4.9函數(shù)的嵌套調(diào)用嵌套調(diào)用C++規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b例如:求三個數(shù)中最大數(shù)和最小數(shù)的差值#include<iostream>usingnamespacestd;intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);intmain(){inta,b,c,d;cin>>a>>b>>c;d=dif(a,b,c);cout<<"Max-Min“<<d<<endl;return0;}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ù)例求三個數(shù)中最大數(shù)和最小數(shù)的差值遞歸調(diào)用定義:函數(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ù)過多,可能引起堆棧溢出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);}例:求n的階乘#include<iostream>usingnamespacestd;intfac(intn){intf;if(n<0)cout<<"n<0,dataerror!“<<endl;elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn,y;cout<<"Inputaintegernumber:“<<endl;cin>>n;y=fac(n);cout<<n<<"!=“<<y<<endl;return0;}例有以下程序#include<iostream>usingnamespacestd;intf(intn){if(n==1)return1;elsereturnf(n-1)+1;}intmain(){inti,j=0;for(i=1;i<3;i++)j+=f(i);cout<<j<<endl;return0;}程序運(yùn)行后的輸出結(jié)果是:a)4b)3c)2d)1if(i)j1112f(2-1)+11+2例:#include<iostream>usingnamespacestd;longfun(intn){longs;if(n==1||n==2)s=2;elses=n-fun(n-1);returns;}intmain(){cout<<fun(3)<<endl;return0;}

運(yùn)行結(jié)果:

n s3 3-fun(3-1) 3-2=1例4.10有5個人坐在一起,問第5個人多少歲?他說比第4個人大兩歲。問第4個人歲數(shù),他說比第3個人大兩歲。問第3個人,又說比第2個人大兩歲。問第2個人,說比第1個人大兩歲。最后問第1個人,他說是10歲。請問第5個人多大?可以用式子表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n>1)運(yùn)行結(jié)果如下:18函數(shù)調(diào)用過程如圖所示#include<iostream>usingnamespacestd;intage(intn){intc;

if(n==1)c=10;elsec=age(n-1)+2;return(c);}intmain(){cout<<age(5)<<endl;回推 遞推}age(n)=10(n=1)運(yùn)行結(jié)果18 age(n-1)+2(n>1)在一個函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。同樣,在復(fù)合語句中定義的變量只在本復(fù)合語句范圍內(nèi)有效。這稱為局部變量(localvariable)。如4.11局部變量和全局變量

4.11.1局部變量floatf1(inta) //函數(shù)f1{intb,c; b、c有效 a有效┆}charf2(intx,inty) //函數(shù)f2{inti,j; i、j有效 x、y有效┆}intmain() //主函數(shù){intm,n;┆{intp,q;p、q在復(fù)合語句中有效 m、n有效┆}}說明:(1)主函數(shù)main中定義的變量也只在主函數(shù)中有效(2)不同函數(shù)中可以使用同名的變量,它們代表不同的對象,互不干擾。(3)可以在復(fù)合語句中定義變量,這些變量僅在本復(fù)合語句中有效。(4)形式參數(shù)也是局部變量。其他函數(shù)不能調(diào)用。(5)在函數(shù)聲明中出現(xiàn)的參數(shù)名,其作用范圍只在本行的括號內(nèi)。例如intmax(inta,intb);//函數(shù)聲明中出現(xiàn)a、b┆intmax(intx,inty)//函數(shù)定義,形參是x、y{cout<<x<<y<<endl;//合法,x、y在函數(shù)體中有效cout<<a<<b<<endl;//非法,a、b在函數(shù)體中無效}編譯時認(rèn)為max函數(shù)體中的a和b未經(jīng)定義。在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量是外部變量,稱為全局變量(全程變量)。全局變量的有效范圍為從定義變量的位置開始到本源文件結(jié)束。如4.11.2全局變量intp=1,q=5;//全局變量 全局變量p、q的作用范圍floatf1(inta)//定義函數(shù)f1{intb,c;┆}charc1,c2;//全局變量 全局變量c1、c2的作用范圍charf2(intx,inty)//定義函數(shù)f2{inti,j;┆}main()//主函數(shù){intm,n;┆}幾點說明:4.12變量的存儲類別概述變量是對程序中數(shù)據(jù)的存儲空間的抽象內(nèi)存…….intmain(){inta;a=10;cout<<a<<endl;return0;}編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元1020002003程序中使用變量名對內(nèi)存操作變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲屬性存儲類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在----靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內(nèi)有效----局部變量與全局變量變量的存儲類型auto-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲類型]數(shù)據(jù)類型變量表;4.12變量的存儲類別概述變量是對程序中數(shù)據(jù)的存儲空間的抽象如:intsum;autointa,b,c;registerinti;staticfloatx,y;局部變量與全局變量局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲類型:autoregisterstatic(默認(rèn)為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函數(shù)中同名變量#include<iostream>usingnamespacestd;intmain(){inta,b;intsub();a=3;b=4;cout<<"main:"<<a<<“,”<<b<<endl;sub();cout<<"main:"<<a<<“,”<<b<<endl;return0;}intsub(){inta,b;a=6;b=7;cout<<"sub:"<<a<<“,”<<b<<endl;}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4全局變量---外部變量定義:在函數(shù)外定義,可為本文件所有函數(shù)共用有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有extern說明的其它源文件

應(yīng)盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯

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

extern數(shù)據(jù)類型變量表;外部變量定義與外部變量說明不同若外部變量與局部變量同名,則外部變量被屏蔽外部變量可用存儲類型:缺省或staticfloatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);cout<<"max="<<max<<"min=“<<min<<"average=“<<ave<<endl;}作用域maxminintp=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ò)展后例外部變量定義與說明#include<iostream>usingnamespacestd;intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;cout<<"max=“<<max(a,b)<<endl;}inta=13,b=-8;運(yùn)行結(jié)果:max=13#include<iostream>usingnamespacestd;externinta,b;intmax(){intz;z=a>b?a:b;return(z);}int

main(){cout<<"max=“<<max()<<endl;return0;}inta=13,b=-8;#include<iostream>usingnamespacestd;inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}intmain(){inta=8;cout<<"max=“<<max(a,b)<<endl;return0;}例外部變量與局部變量運(yùn)行結(jié)果:max=8inti;#include<iostream>usingnamespacestd;intmain(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)cout<<“*”;cout<<endl;}例外部變量副作用運(yùn)行結(jié)果:*****動態(tài)變量與靜態(tài)變量存儲方式靜態(tài)存儲:程序運(yùn)行期間分配固定存儲空間動態(tài)存儲:程序運(yùn)行期間根據(jù)需要動態(tài)分配存儲空間內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等生存期靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束變量存儲類型靜態(tài)動態(tài)存儲方式程序整個運(yùn)行期間函數(shù)調(diào)用開始至結(jié)束生存期編譯時賦初值,只賦一次每次函數(shù)調(diào)用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語句內(nèi)本文件其它文件register局部staticauto外部static外部存儲類別局部變量默認(rèn)為auto型register型變量個數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域例文件inta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例auto變量的作用域#include<iostream>usingnamespacestd;intmain(){intx=1;voidprt(void);{intx=3;prt();cout<<“2ndx=”<<x<<endl;}cout<<“1stx=”<<x<<endl;return0;}voidprt(){intx=5;cout<<“3thx=”<<x<<endl;}運(yùn)行結(jié)果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域#include<iostream>usingnamespacestd;intmain(){voidincrement(void);increment();increment();increment();return0;}voidincrement(void){intx=0;x++;cout<<x<<endl;}例局部靜態(tài)變量值具有可繼承性運(yùn)行結(jié)果:111#include<iostream>usingnamespacestd;intmain(){voidincrement(void);increment();increment();increment();return0;}voidincrement(void){staticintx=0;x++;cout<<x<<endl;}運(yùn)行結(jié)果:123例變量的壽命與可見性#include<iostream.h>inti=1;main(){staticinta;registerintb=-10;intc=0;cout<<"-----MAIN------\n“<<endl;cout<<"i:"<<i<<"a:"<<a<<“b:"<<b<<"c:"<<c<<c=c+8;other();cout<<"-----MAIN------\n“<<endl;cout<<"i:"<<i<<"a:"<<a<<“b:"<<b<<"c:"<<c<<i=i+10;other();}other(){staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;cout<<"-----OTHER------“<<endl;printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0靜態(tài)存儲區(qū)動態(tài)存儲區(qū)other:a2other:b0other:c10843315443other:c10675156#include<iostream>usingnamespacestd;int

main(){voidgx(),gy();externintx,y;cout<<“1:x=”<<x<<“\ty=“<<y<<endl;y=246;gx();gy();}voidgx(){externintx,y;x=135;cout<<“2:x=”<<x<<“\ty=“<<y<<endl;}intx,y;voidgy(){cout<<“3:x=”<<x<<“\ty=“<<y<<endl;}例用extern擴(kuò)展外部變量作用域運(yùn)行結(jié)果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部變量intglobal;externfloatx;main(){intlocal; . . .}externintglobal;staticintnumber;func2(){ . . .}floatx;staticintnumber;func3(){externintglobal; . . .}例引用其它文件中的變量,輸出ab和a的m次方inta;voidmain(){intpower(intn);intb=3,c,d,m;cout<<“Enterthenumberaanditspower:\n”;cin>>a>>m;c=a*b;cout<<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

提交評論