第-章━━函數的定義和調用優秀文檔_第1頁
第-章━━函數的定義和調用優秀文檔_第2頁
第-章━━函數的定義和調用優秀文檔_第3頁
第-章━━函數的定義和調用優秀文檔_第4頁
第-章━━函數的定義和調用優秀文檔_第5頁
已閱讀5頁,還剩33頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C++程序設計第3章(1)

━━函數的定義和調用1主要內容函數概述函數的定義函數的調用和返回函數的參數傳遞━━值傳遞函數的參數傳遞━━引用傳遞函數的原型聲明全局變量及其作用域局部變量及其作用域C++程序的內存布局標識符的作用域━━塊作用域、文件作用域、函數原型作用域、函數作用域變量的存儲類型和生存期函數的調用機制2函數概述關于C++函數:①C++程序的結構化特點:就是整個程序由一個或多個函數組成,每個函數具有相對獨立的功能,函數之間有明顯的界面,程序整體具有清晰的模塊結構,易于修改。

②C++函數有兩大類:一類是系統預定義的,稱為庫函數或標準函數,這些庫函數按照不同的功能進行分類,集中定義在不同的頭文件中,用戶只要在自己的程序中包含某個頭文件,就可直接使用該頭文件中定義的函數。另一類是用戶自定義函數,用戶可以根據需要將程序中某個具有相對獨立功能的程序段定義為函數。③C++程序的基本模塊:就是函數,任何一個C++程序均由若干個函數組成,其中有且僅有一個主函數,它是程序執行的入口函數,VC++控制臺編程是由用戶定義的main()作為入口函數,Windows編程是由編譯器定義的WinMain()作為入口函數。3函數概述④C++函數之間是并列平等的關系,在程序中的定義位置任意,一個函數可以調用其它函數,也可以被其他函數所調用,但主函數只能調用其他函數,而不能被調用。函數定義的并列關系函數調用的層次關系

voidf1() {f1的函數體…}

voidf2() {f2的函數體…}

voidmain() {main的函數體}

voidf3() {f3的函數體…}

voidf4() {f4的函數體…}

voidf5() {f5的函數體…}main()f1()f2()f3()f4()f6()4函數的定義函數的定義:①格式:《返回值類型》函數名

(

《類型1形參1

,類型2形參2

,…,類型n形參n》

)

{

語句序列

}②說明:

返回值類型━━可以是C++中任意基本數據類型、已定義的構造數據類型;若函數沒有返回值,則返回值類型定義為void型;若函數返回值類型省略,表示返回值類型為int型。函數體函數頭5函數的定義函數名━━按標識符命名規則命名,其后括號內定義的是函數的形式參數;若該函數為無參函數,括號內的void通常省略不寫,但括號不能省略!形式參數表━━列出所有形式參數的數據類型、參數名稱;各參數即使類型相同,也必須分別進行類型說明;形參類型可以是C++中任意基本數據類型、已定義的構造數據類型。函數參數的作用:函數調用時,主調函數通過參數將數據傳遞給被調函數。函數返回值的作用:函數返回時,被調函數可將一個確定的值帶回到主調函數。①若函數有返回值,則return語句格式為:return表達式;

且return后面表達式值的類型必須與函數返回值類型相匹配!

②若函數無返回值,則返回值類型定義為void,且return語句格式為:return;6函數的調用和返回函數的調用:①格式:

函數名

(《實參1

,實參2

,…,實參n》)

②調用:就是控制從主調函數轉去執行被調函數的函數體。調用時,系統要將實參值按位置傳遞給對應的形參,因此,一般情況下實參與形參在個數、排列順序上都必須一一對應,且類型匹配。函數的返回:就是控制從被調函數返回到主調函數的調用點。返回時,即在被調函數中執行到return語句時,若有返回值帶回,則先計算return語句后面表達式的值,并轉換成所規定的返回值類型,此時系統會在內存中建立一個臨時變量,用來存放該返回值,待主調函數中包含該調用式的表達式語句從該臨時變量中取值后,系統便撤消該臨時變量。7【例】(定義求三個實數中最大數的函數max()。)#include<iostream.h>float

max(floatx,floaty,floatz)

//要將三個實數傳遞給max()函數,需定義三個形參。{

floatt=y>z?y:z;

return(x>t?x:t);}voidmain(){floata,b,c;cout<<“請輸入三個實數:”;cin>>a>>b>>c;cout<<“最大數:”<<max(a,b,c)<<endl;}

運行:請輸入三個實數:1356-89↙最大數:56main()函數調用max(13,56,-89)main()函數的后續語句函數max(13,56,-89)return56主調函數被調函數8函數的參數傳遞形參與實參:

①函數定義時,寫在函數頭部參數表中的變量,稱為形式參數(形參)。

②函數調用時,寫在調用式參數表中的表達式、變量、常量,稱為實在參數(實參)形參與實參的結合:編譯時,并不為各函數的形參分配存儲空間,只有在該函數被調用時,其形參才占用存儲空間,并通過堆棧從主調函數中獲得值,這個過程稱為形參與實參的結合,一旦函數調用結束,該函數的形參就被撤銷。函數的參數傳遞方式有三種:①值傳遞

②引用傳遞③地址傳遞9函數的參數傳遞━━值傳遞值傳遞:

①調用函數進行值傳遞時,調用式中對應的實參可以是常量、變量、表達式。

②先計算出各個實參表達式的值,并將值賦給對應的形參變量,其過程就是賦值,因此,要求實參值的類型與形參變量類型符合賦值兼容。

③由于值傳遞就是賦值傳遞,因此是單向傳遞,即實參值傳遞給形參變量后,若形參變量的值發生變化不會影響到對應的實參變量?!纠?include<iostream.h>voidswap(

inta

,

intb

){

intt=a;a=b;b=t;

}voidmain(){intx,y;cout<<“請輸入兩個整數:”;cin>>x>>y;cout<<“調用前:x=”<<x<<“\ty=”<<y<<endl;

swap(

x

,

y

);cout<<“調用后:x=”<<x<<“\ty=”<<y<<endl;

}

運行:請輸入兩個整數:5897↙調用前:x=56y=97調用后:x=56y=9710【例】#include<iostream.h>intmaxi(inta,intb){ returna>b?a:b;}floatmaxf(floata,floatb){ returna>b?a:b;}voidmain(void){floatx=3.4,y=5.6;charc1=‘A’,c2=‘B’;inti=20,j=30;cout<<maxi(x,y)

<<‘\t’;cout<<maxf(x,y)

<<‘\t’;cout<<maxi(c1,c2)

<<‘\t’;cout<<maxf(c1,c2)

<<‘\t’;cout<<maxi(i+j,45+y)

<<‘\t’;cout<<maxf(i+j,45+y)

<<endl;}運行:floatx=3.4→inta=3floaty=5.6→intb=5floatx=3.4→floata=3.4floaty=5.6→floatb=5.6charc1=‘A’→inta=65charc2=‘B’→intb=66charc1=‘A’→floata=65charc2=‘B’→floatb=66表達式i+j值50,int型→inta=50表達式45+y值50.6,float型→intb=50表達式i+j值50,int型→floata=50表達式45+y值50.6,float型→floatb=50.611函數的參數傳遞━━引用傳遞引用類型:是C++中一種特殊的數據類型,

定義引用類型變量,其本質是給一個已定義的變量起一個別名,系統并不為引用類型變量分配內存空間,引用類型變量與其相關聯的變量使用的是同一個內存空間。引用類型變量的定義:

①格式:

<類型>&

<引用類型變量名>

=<變量名>

②功能:定義一個引用類型變量,必須同時對其進行初始化,使之與一個已定義過的同類型變量相關聯,即給該已定義過的變量起一個別名?!纠?include<iostream.h>voidmain(){intx=5;int&

x1

=x;intx2=x;

x1+=2;cout<<“x=”<<x<<“\tx1=”<<x1<<“\tx2=”<<x2<<endl;}

5→7xx15x2運行:x=7x1=7x2=512函數的參數傳遞━━引用傳遞引用類型變量可以作為函數的形參,以實現參數的引用傳遞。

【例】voidswap(

int&a

,

int&b

){

intt=a;a=b;b=t;

}引用傳遞:①調用函數時,系統對引用類型的形參是不分配存儲空間的,其本質是給對應的實參變量起一個別名。②進行引用傳遞時,調用式中對應的實參只能是變量。③引用傳遞時傳遞的是變量名,引用類型的形參變量與其相關聯的實參變量使用的是同一個存儲空間,若引用類型的形參變量的值發生變化,其相關聯的實參變量的值也就隨之變化,因此是雙向傳遞。13【例】(值傳遞)#include<iostream.h>voidswap(

inta

,intb

){

intt=a;a=b;b=t;}voidmain(){intx=5,y=10;cout<<“調用前:x=”<<x<<“\ty=”<<y<<endl;

swap(

x

,

y

);cout<<“調用后:x=”<<x<<“\ty=”<<y<<endl;

}

【例】(引用傳遞)#include<iostream.h>voidswap(

int&a

,int&b

){intt=a;a=b;b=t;}voidmain(){intx=5,y=10;cout<<“調用前:x=”<<x<<“\ty=”<<y<<endl;

swap(

x,y

);cout<<“調用后:x=”<<x<<“\ty=”<<y<<endl;}

運行:調用前:x=5y=10調用后:x=10y=5引用傳遞:main():swap():x

a

10y

b

5510運行:調用前:x=5y=10調用后:x=5y=10值傳遞:main():swap():x

a

10y

b

551051014函數的原型聲明函數的原型聲明:①C++中,把函數的定義部分稱為函數的定義性聲明,而把對函數的引用性聲明稱為函數的原型聲明。②當函數定義在前、調用在后時,可直接調用;當函數調用在前、定義在后時,在函數被調用前,必須對被調函數作原型聲明,函數原型聲明可放在主調函數中,也可放在所有函數之外。③函數原型聲明的目的是告知編譯系統,該函數的返回值類型、參數個數、順序、各參數的類型,以便編譯系統對其后該函數調用式是否有效進行語法檢查。函數原型聲明的格式:

格式1:

函數頭+末尾加分號

《返回值類型》函數名

(

《類型1形參1

,類型2形參2

,…,類型n形參n》

);格式2:函數頭(去掉形參變量名)+末尾加分號《返回值類型》函數名

(《類型1

,類型2

,類型n

》);15【例】(輸入一個8位二進制數,將其轉換為十進制數輸出。例:若輸入11010001,

110100012=1(27)+1(26)+0(25)+1(24)+0(23)+0(22)+0(21)+1(20)=20910,輸出209。)#include<iostream.h>voidmain(){double

power(

double

,

int

);//power()函數的引用性聲明,即原型聲明

intvalue=0,k;charc;cout<<“請輸入一個8位二進制數:”;

for(inti=7;i>=0;i--)

{cin>>c; if(c==‘1’)value+=(int)power(

2

,

i);}//調用power()函數

cout<<“十進制數:”<<value<<endl;}

doublepower(doublex,intn)//power()函數的定義性聲明{doublet=1;while(n--)t*=x;

returnt

;}運行:請輸入一個8位二進制數:11010001↙十進制數:20916②當函數定義在前、調用在后時,可直接調用;for(inti=1;i<=n;i++)《返回值類型》函數名(《類型1形參1,類型2形參2,…,類型n形參n》){intx=5;//x為auto局部變量,在棧區4→floata=3.③局部數據區(棧區)━━存放auto局部變量。::b=::b+4;//引用全局變量b{floatt=y>z?y:z;①作用:若程序中的某個變量要被多個函數所訪問,可將其定義為全局變量?!洞鎯︻愋汀奉愋妥兞棵?《=初值1》《,變量名2《=初值2》,…》;《存儲類型》類型變量名1《=初值1》《,變量名2《=初值2》,…》;for(inti=1;i<=3;i++)【例】voidswap(int&a,int&b){intt=a;a=b;b=t;}【例】(求π的值,arctan(x)用級數計算,直到某項絕對值不大于10-15為止。)#include<iostream.h>#include<math.h>voidmain(){doublea,b;

doublearctan(doublex)

;//arctan()函數的引用性聲明,即原型聲明a=16*arctan(

1/5.

);//調用arctan()函數,且如果寫成1/5,結果就都是0b=4*arctan(

);//調用arctan()函數,且如果寫成1/239,結果就都是0cout<<“π=”<<(a-b)<<endl;}

doublearctan(doublex)//arctan()函數的定義性聲明{

doublet=x,sum=0;

for(intsign=1,i=1;

fabs(t/i)>1e-15;i+=2)

{

sum+=sign*t/i;t=t*x*x;sign*=-1;}

returnsum; }運行:17【例】(找出11~999之間的數m,使之滿足m、m2、m3均為回文數。回文:各位數字左右對稱的整數。例:11、112=121、113=1331,則輸出11。)分析:從最低位開始,用除10取余的方法,依次取出該數的各位數字;按反序重新構成新的數,若新數與原數完全相等,則原數為回文。#include<iostream.h>voidmain(){boolsymm(intn);

//symm()函數的引用性聲明,即原型聲明for(intm=11;m<=999;m++) if( symm(m)

&&symm(m*m)

&&symm(m*m*m

)

) cout<<“m=”<<m<<“\tm*m=”<<m*m<<“\tm*m*m=”<<m*m*m<<endl;}

boolsymm(intn)//symm()函數的功能是判斷整數n是否是回文{

for(inti=n,m=0

;

i!=0;

i=i/10)

m=m*10+i%10;//m是新構的數

return(m==n);}運行:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=136763118【例】(求如下公式,r和s值鍵盤輸入,SIN(x)用級數計算,計算精度為10-3。)#include<iostream.h>#include<math.h>voidmain(){doubletsin(double);doublek,r,s;cout<<“請輸入r和s的值:”;cin>>r>>s;if(r*r<=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));elsek=tsin(r*s)/2;cout<<“r=”<<r<<“\ts=”<<s<<“\tk=”<<k<<endl;}

doubletsin(doublex){doublesum=0,t=x;

for(inti=1,sign=1,p=1;

fabs(t/p)>=1e-3

;

sign*=-1)

{

sum+=

sign*t/p;t=t*x*x;i+=2;p=p*i*(i-1);}

returnsum;}運行:請輸入r和s的值:31↙19全局變量及其作用域關于全局變量:①作用:若程序中的某個變量要被多個函數所訪問,可將其定義為全局變量。

②全局變量:指定義在函數之外的變量。

③作用域:全局變量可以定義在函數外的任何位置,一旦在某個位置定義了全局變量,其后的任何函數均可以訪問該全局變量。④存儲類型:全局變量存放在全局數據區(靜態區),分配該區時內存自動初始化為0,因此全局變量若不做初始化,其初值為0。⑤生存期:全局變量在程序開始運行時就在全局區分配,程序運行結束才被釋放。20局部變量及其作用域關于局部變量:①塊的概念:指程序中用花括號“{}”括起來的一個程序段,稱為一個塊。②局部變量:指定義在函數之內或某個塊內的變量。

③作用域:局部變量可以定義在塊內的任何位置,一旦在塊內的某個位置定義了局部變量,只能在該塊內該位置之后的那個區域內才可以訪問該局部變量。④存儲類型:auto自動類型局部變量、static靜態類型局部變量。⑤auto自動局部變量:存放在局部數據區(棧區),分配棧區時內存不做初始化,因此auto局部變量若不做初始化,其初值不確定。⑥static靜態局部變量:存放在全局數據區(靜態區),分配該區時內存自動初始化為0,因此static局部變量若不做初始化,其初值為0。21C++程序的內存布局操作系統為一個C++程序運行定義了四個內存區域:①代碼區━━存放程序代碼。②全局數據區(靜態區)━━存放全局變量、static靜態局部變量。全局變量在程序開始運行時就在該區分配;static靜態局部變量在程序運行中第一次進入其作用域時在該區分配。二者都是直到程序運行結束才被釋放。

③局部數據區(棧區)━━存放auto局部變量。在程序運行到其作用域時在棧區分配,但怎樣分配在編譯時就已經確定。auto局部變量在離開其作用域時即被釋放。④動態數據區(自由存儲區、堆區)

━━存放運行時由new運算符動態創建的變量。動態創建的變量在編譯時無法為它們預定存儲空間,系統根據運行時的具體要求在該區進行分配。在該區的變量必須用delete運算符才能將其釋放。22標識符的作用域作用域:指程序中標識符(如變量名、函數名)的有效使用范圍,即作用范圍。目的:解決標識符的同名問題。當標識符具有不同的作用域時,允許標識符同名;當標識符的作用域完全相同時,不允許標識符同名。C++中作用域有五種:①塊作用域②文件作用域③函數原型作用域④函數作用域⑤類作用域23標識符的作用域━━塊作用域塊:指程序中用花括號“{}”括起來的一個程序段,稱為一個塊。塊作用域:在塊內聲明的變量只能在該塊內被引用,開始于變量的聲明處,結束于塊的結尾處。幾條原則:

①形參變量的作用域:在其所屬函數的函數體塊內。②局部變量的作用域:在其所屬的塊內,該變量的聲明位置之后的那個區域內。③循環語句for(表達式1;表達式2;表達式3)中表達式1所聲明變量的作用域:在for語句所屬的塊內,該變量的聲明位置之后的那個區域內。④局部優先原則:具有塊作用域的標識符在其作用域內,將屏蔽其作用塊包含本塊的同名標識符。24【例】(塊作用域)#include<iostream.h>intfun(intn){cout<<“正在求:1+2+…+”<<n<<“\n”;

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

{

chara=7;cout<<a;s+=i;

}returns;}voidmain(){inta=5,b=7;cout<<“第1次調用:”<<fun(a)<<endl;

{inta

=9,

b

=11;cout<<“第2次調用:”<<fun(a)<<endl;cout<<“第3次調用:”<<fun(b)<<endl;

}cout<<“第4次調用:”<<fun(b)<<endl;

}形參n作用域局部s作用域局部i作用域局部a作用域局部a、b作用域局部a、b作用域運行:正在求:1+2+…+5第1次調用:15正在求:1+2+…+9第2次調用:45正在求:1+2+…+11第3次調用:66正在求:1+2+…+7第4次調用:2825【例】(塊作用域)#include<iostream.h>voidmain(){inta=10,b=20,c=30;cout<<“a=”<<a<<“\tb=”<<b<<“\tc=”<<c<<endl;

{inta=40,b

=50;

c=a+

b;cout<<“a=”<<a<<“\tb=”<<b<<“\tc=”<<c<<endl;}cout<<“a=”<<a<<“\tb=”<<b<<“\tc=”<<c<<endl;}【例】(塊作用域)#include<iostream.h>voidmain(){for(

inta=1

;a<=5;a++)

{

inta=2;cout<<“a=”<<++a<<endl;

}cout<<“a=”<<a<<endl;}

運行:a=10b=20c=30a=40b=50c=90a=10b=20c=90運行:a=3a=3a=3a=3a=3a=626標識符的作用域━━文件作用域文件作用域:在函數外聲明的變量可在該文件內被引用,開始于變量的聲明處,結束于文件的結尾處,即一旦在某個位置定義了全局變量,在其后的整個文件中均可以訪問。幾條原則:

①全局變量作用域從定義處開始到文件結尾處結束,遵循聲明在前、使用在后。②當全局變量引用在前、聲明在后時,需先對全局變量作外部聲明。格式:extern

類型全局變量名;③當全局變量與塊作用域內的局部變量同名時,局部變量優先。④在塊作用域內,若要引用同名的全局變量時,可通過域運算符“::”來引用。格式:

::

全局變量名

27#include<iostream.而一般的全局變量可以通過extern修飾后,作用于該程序的多個源文件。if(r*r<=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));①調用函數進行值傳遞時,調用式中對應的實參可以是常量、變量、表達式。cout<<maxf(x,y)<<‘\t’;charc;④動態數據區(自由存儲區、堆區)━━存放運行時由new運算符動態創建的變量。【例】(求如下公式,r和s值鍵盤輸入,SIN(x)用級數計算,計算精度為10-3。cout<<maxf(i+j,45+y)<<endl;a=5b=6a=5b=6cout<<“x=”<<x<<“\tx1=”<<x1<<“\tx2=”<<x2<<endl;}④局部優先原則:具有塊作用域的標識符在其作用域內,將屏蔽其作用塊包含本塊的同名標識符。⑦返回到主調函數繼續執行。a=5b=6變量的存儲類型和生存期cout<<“x=”<<x<<“\tx1=”<<x1<<“\tx2=”<<x2<<endl;}voidf3()swap(x,y);變量的存儲類型和生存期若需引用,可間接實現,即通過該static局部變量的地址進行訪問(后續章節介紹)。作用域:指程序中標識符(如變量名、函數名)的有效使用范圍,即作用范圍。cout<<“x=”<<x<<“\tx1=”<<x1<<“\tx2=”<<x2<<endl;}②文件作用域while(n--)t*=x;變量的存儲類型和生存期cout<<“調用后:x=”<<x<<“\ty=”<<y<<endl;④在塊作用域內,若要引用同名的全局變量時,可通過域運算符“::”來引用。①聲明局部變量時,用static修飾屬靜態類型變量,存放在全局數據區,即靜態區。6,float型→floatb=50.③引用傳遞時傳遞的是變量名,引用類型的形參變量與其相關聯的實參變量使用的是同一個存儲空間,若引用類型的形參變量的值發生變化,其相關聯的實參變量的值也就隨之變化,因此是雙向傳遞。#include<iostream.調用后:x=10y=5【例】(文件作用域)#include<iostream.h>inta

=5,

b

;

//a、b定義在函數外,為全局變量externintc;//全局變量c引用在前、聲明在后時,需先外部聲明voidmain(){inta=10,b=20; //a、b定義在函數內,為局部變量cout<<“a=”<<a<<“\tb=”<<b<<“\tc=”<<c<<endl; a=18; ::b=::b+4;//引用全局變量b c=::a+a;//引用全局變量c和a,引用局部變量acout<<“a=”<<a<<“\tb=”<<b<<“\tc=”<<c<<endl;cout<<“a=”<<::a<<“\tb=”<<::b<<“\tc=”<<c<<endl;}intc=88;//c定義在函數外,為全局變量運行:a=10b=20c=88a=18b=20c=23a=5b=4c=2328標識符的作用域━━函數原型作用域、函數作用域函數原型作用域:①在函數原型聲明的參數表中聲明的標識符,所具有的作用域稱為函數原型作用域,即從其聲明處開始,到函數原型聲明的結束處結束。②函數原型聲明中所聲明的標識符,其作用域僅在函數原型聲明的語句內,因此與該函數的定義和調用均無關,所以在函數原型聲明中可只作參數的類型聲明,而省略參數名。【例】函數原型聲明:voidswap(

inta

,

intb);//a、b作用域僅在該句內函數原型聲明:voidswap(

int,

int);函數作用域:①函數作用域是指在函數內定義的標識符在其定義的函數內均有效,即不論在函數內的任何地方定義,在整個函數內均可以引用。②C++中只有語句標號具有函數作用域。29變量的存儲類型和生存期存儲類型:變量的存儲類型反映了變量占用內存空間的期限,它規定了變量的生存期,即何時為變量分配內存空間、何時撤消變量收回為其分配的內存空間。在聲明變量時,可對其存儲類型進行定義,格式:《存儲類型》類型

變量名1《

=初值1

》《,變量名2《

=初值2

》,

…》;

◆其中存儲類型有四種:①自動類型━━auto②靜態類型━━static③寄存器類型━━register④外部類型━━extern

◆當存儲類型省略時,對于局部變量則表示auto。30變量的存儲類型和生存期auto自動類型變量:①聲明局部變量時,用auto修飾屬自動類型變量,存放在局部數據區,即棧區。②auto局部變量在程序運行到其作用域時在棧區分配,在離開其作用域時即被釋放,因此生存期僅在其作用域內。③聲明局部變量時若省略存儲類型,C++編譯器默認為auto。④自動類型變量未初始化時,其初值不確定。⑤全局變量無自動類型。31變量的存儲類型和生存期static靜態類型變量:①聲明局部變量時,用static修飾屬靜態類型變量,存放在全局數據區,即靜態區。②static局部變量的生存期:在程序運行中第一次進入其作用域時在靜態區分配,離開其作用域時并不釋放,只是不能引用,若程序運行中再次進入該static局部變量的作用域,由于該變量已經存在,所以不再分配空間,可直接引用。static局部變量直到程序運行結束才被釋放。③static局部變量的作用:是保存函數的運行結果,以便再次調用該函數時,能繼續使用上次調用的計算結果。注意,不在其作用域時,不能直接引用;若需引用,可間接實現,即通過該static局部變量的地址進行訪問(后續章節介紹)。32變量的存儲類型和生存期④全局變量聲明時無論前面加或不加static,都具有靜態生存期,因為全局變量都存放在全局數據區,即靜態區。⑤但用static修飾的全局變量,稱為靜態全局變量。靜態全局變量與一般的全局變量在形式上類似,但含義有所不同,靜態全局變量只能在其定義的源文件中有效(該文件中可以有若干個函數),而在該程序的其他源文件中則是無效的;而一般的全局變量可以通過extern修飾后,作用于該程序的多個源文件。⑥靜態類型變量未初始化時,其初值為0。33【例】#include<iostream.h>inta

=1,

b

=2

;

//a、b為全局變量,在靜態區intfun(){

staticinta=3;//a為靜態局部變量,在靜態區

intb=4;//b為auto局部變量,在棧區a+=b;

returna;}voidmain(){inta=5,b=6; //a、b為auto局部變量,在棧區cout<<“a=”<<a<<“\tb=”<<b<<endl;

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

{

cout<<“第”<<i<<“次調用:”<<fun()<<endl;cout<<“a=”<<a<<“\tb=”<<b<<endl;}cout<<“a=”<<::a<<“\tb=”<<::b<<endl;}運行:a=5b=6第1次調用:7a=5b=6第2次調用:11a=5b=6第3次調用:15a=5b=6a=1b=234【例】(與上例比較)#include<iostream.h>inta

=1,

b

=2

;

//a、b為全局變量,在靜態區intfun(){inta=3;

溫馨提示

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

評論

0/150

提交評論