版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++大學基礎教程第5章函數(shù)與編譯預處理北京科技大學15.1函數(shù)概述5.2函數(shù)定義及調用5.3
C++中的特殊函數(shù)5.4函數(shù)模板5.5局部變量和全局變量5.6變量的生存期和存儲類別5.7編譯預處理(自學)
第5章
函數(shù)本章將介紹關于函數(shù)的知識,函數(shù)是實現(xiàn)算法的基本單位,函數(shù)的設計和使用是學習程序設計必須掌握的基本知識,重點介紹:函數(shù)的概念、定義、原型聲明、函數(shù)的參數(shù)及函數(shù)調用函數(shù)還有一些特殊的形式,如內聯(lián)函數(shù)、重載函數(shù)、具有默認參數(shù)值的函數(shù)等。這些函數(shù)的特殊形式,使我們在利用函數(shù)實現(xiàn)算法時更方便靈活。變量的存儲類型以及標識符的作用域等概念,也是我們必須掌握的基本知識。5.1函數(shù)概述5.1.1函數(shù)簡介C++程序的組成一般是將整個程序分為若干個程序模塊每個模塊用來實現(xiàn)一個特定的的功能這就是結構化程序設計的思想!C++中模塊的實現(xiàn)函數(shù)類函數(shù)是具有一定功能又經(jīng)常使用的相對獨立的代碼段【例】
#include<iostream>usingnamespacestd;voidprint_line(){cout<<"*********************************"<<endl;}voidprint_text(){cout<<"WelcometoChina"<<endl;}intmain(){
print_line();
print_text();
print_line(); return0;}程序的執(zhí)行總是從main函數(shù)開始intmain函數(shù){
……
調用函數(shù)
print_line();
……}函數(shù)
print_line(){
……
}⑴一個C++源程序可以由一個或多個源程序文件組成。C++編譯系統(tǒng)在對C++源程序進行編譯時是以文件為單位進行的。⑵一個C++源程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調用其它函數(shù),其它函數(shù)可以相互調用。⑶在一個C++程序中,有且僅有一個主函數(shù)main。C++序的執(zhí)行總是從main函數(shù)開始,調用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結束整個程序的運行。說明5.1.2函數(shù)的種類從使用的角度看:①標準函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調用它們。附錄列出了C++的部分庫函數(shù)。②用戶自定義函數(shù)。如:例中的print_line()函數(shù)。庫函數(shù):由C++編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)需要隨時調用常用函數(shù)如:fabs、sqrt、sin、pow、rand(常用數(shù)學函數(shù)參見教材附錄)函數(shù)調用形式:函數(shù)名([參數(shù)表])例如:
sqrt(x)數(shù)學函數(shù)庫中的多數(shù)函數(shù)都返回double類型結果。使用數(shù)學庫函數(shù),需要在程序中包含math.h頭文件,這個頭文件在新的C++標準庫中稱為cmath。函數(shù)參數(shù)可取常量、變量或表達式。例:如果c=13.0、d=3.0和f=4.0,則下列語句:
cout<<sqrt(c+d*f);
計算并顯示13.0+3.0*4.0=25.0的平方根,即5.0。
5.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…
){說明語句
執(zhí)行語句
}例如:求兩個數(shù)的最大值。
int
max(int
x,inty){intz;z=x>y?x:y;return(z);}5.2函數(shù)定義及調用程序如下:#include<iostream>usingnamespacestd;int
cube(inty);//函數(shù)原型聲明intmain(){
intx;
cin>>x;
cout<<x<<"的立方是:"<<cube(x)<<endl; return0;}/*函數(shù)定義*/
int
cube(inty)//函數(shù)定義{ returny*y*y;}例5-1編寫一個函數(shù)cube,計算整數(shù)的立方?;ɡㄌ栔幸部梢詾榭?,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內定義其他函數(shù),即函數(shù)不能嵌套定義。函數(shù)名(實參表列)在C語言中,把函數(shù)調用也作為一個表達式。因此凡是表達式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調用。例如:①welcome();/*函數(shù)調用語句*/②if(iabs(a)>max)max=iabs(a);
/*函數(shù)調用構成表達式*/
③m=max(c,max(a,b));/*函數(shù)調用作為函數(shù)參數(shù)*/5.2.2函數(shù)的調用函數(shù)調用的一般形式:voidswap(intx,inty){intz;z=x;x=y;y=z; ……}intmain(){inta=100,b=200;
swap(a,b); ……return0;}5.2.3函數(shù)參數(shù)傳遞與返回值1.函數(shù)的參數(shù)傳遞(1)值傳遞程序輸出結果:x=200y=100a=100b=200形式參數(shù)(形參)實際參數(shù)(實參)【例】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞有關形參和實參的說明:
①當函數(shù)被調用時才給形參分配內存單元。調用結束,所占內存被釋放。②實參可以是常量、變量或表達式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型兼容。④實參與形參的個數(shù)必須相等。在函數(shù)調用時,實參的值賦給與之相對應的形參。“單向值傳遞”。(2)地址傳遞地址傳遞實質也是將實參的值賦給形參,只是這時所賦的值是一個變量或數(shù)組的地址,這是形參必須是能夠接收地址的變量,即指針變量。實參為數(shù)組名是典型的地址傳遞。若實參是數(shù)組名,由于數(shù)組名是數(shù)組的首地址,因此,與它相對應的形參必須是數(shù)組名或指針變量。數(shù)組作函數(shù)參數(shù)包括兩種情況,一種是數(shù)組元素作函數(shù)參數(shù),由于數(shù)組元素相當于一個變量,因此數(shù)組元素可以作函數(shù)的實參,傳遞給形參的是數(shù)組元素的值,屬于值傳遞。另一種是數(shù)組名作函數(shù)參數(shù),用數(shù)組名作函數(shù)的實參,傳遞的是數(shù)組的首地址,此時形參也應定義為數(shù)組形式,形參數(shù)組的長度可以省略。【例5-4】用冒泡法將10個整數(shù)排序。
#include<iostream>#include<iomanip>usingnamespacestd;voidprintarr(intb[10]){
inti; for(i=0;i<10;i++)
cout<<setw(5)<<b[i];
cout<<endl;}voidsort(intb[],intn){
int
i,j,t; for(i=1;i<n;i++) for(j=0;j<n-i;j++) if(b[j]>b[j+1]) {t=b[j];b[j]=b[j+1];b[j+1]=t;}}intmain(){
inta[10]={10,21,62,96,57,81,44,31,72,35};
cout<<"排序前:"<<endl;
printarr(a); sort(a,10);
cout<<"排序后:"<<endl;
printarr(a); return0;}運行結果:排序前:
10216296578144317235排序后:
10213135445762728196主函數(shù)調用sort函數(shù)時,將實參a傳遞給形參b。假設a數(shù)組的首地址是3000,則b數(shù)組的首地址也是3000。在sort函數(shù)中對b數(shù)組中的10個數(shù)排序后,b數(shù)組中元素的值發(fā)生了變化,實際上a數(shù)組的值也隨之發(fā)生變化。2.函數(shù)的類型和返回值(1)函數(shù)的類型在定義一個函數(shù)時首先要定義函數(shù)的類型,例如:int
cube(intx){…)cube函數(shù)的類型為整型。C++語言中,常量、變量以及表達式有類型,函數(shù)也有類型,函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認其為整型。函數(shù)的返回值是通過return語句帶回到主調函數(shù)的功能:終止函數(shù)的運行,返回主調函數(shù),若有返回值,將返回值帶回主調函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達式類型一般應和函數(shù)的類型一致,如果不一致,系統(tǒng)自動將表達式類型轉換為函數(shù)類型。(2)函數(shù)的返回值return語句格式:return;或return表達式
;【例5-5】計算并輸出圓的面積。#include<iostream>usingnamespacestd;s(intr){return3.14*r*r;}intmain(){
int
r,area;
cin>>r; area=s(r);
cout<<"圓的面積:"<<area<<endl; return0;}自動轉換為int型程序運行情況如下:3'28說明:無返回值的函數(shù)應將其類型定義為void(空)類型。5.2.4函數(shù)的嵌套調用main函數(shù){
……
調用函數(shù)A;
……}函數(shù)A{……
調用函數(shù)B;
……}函數(shù)B{
……
……
……}【例】函數(shù)的嵌套調用。intmain(){intn=3;
cout<<sub1(n)<<endl;return0;}sub1(intn){int
i,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結果:9【例5-7】編程求#include<iostream>usingnamespacestd;intfun2(intn,inti) //定義函數(shù)求各項的值{
intm=n; while(--i>0) m=m*n; returnm;}longfun1(intn) //定義函數(shù)求各項和,即表達式的值{ longsum=0;inti;
for(i=1;i<=10;++i) sum+=fun2(n,i); returnsum;}intmain(){
intn;
cout<<"輸入一個正整數(shù):"<<endl;
cin>>n;
cout<<"表達式的值是:"<<fun1(n)<<endl; return0;}運行結果:輸入一個正整數(shù):5表達式的值是:122070305.2.5函數(shù)原型
引用函數(shù)之前,要先指定函數(shù)的接口形式函數(shù)原型函數(shù)定義函數(shù)原型聲明格式:
函數(shù)類型函數(shù)名(形式參數(shù)表);例:int
Max(inta,intb)函數(shù)原型
函數(shù)原型聲明使編譯器獲得關于函數(shù)名稱、函數(shù)類型、函數(shù)形參個數(shù)、形參類型和形參順序的信息。函數(shù)調用時,編譯器根據(jù)函數(shù)原型聲明驗證函數(shù)調用正確與否。
函數(shù)原型
庫函數(shù)的聲明在相應的庫的頭文件中,使用庫函數(shù)時要包含相應的頭文件。例:#include<cmath>
調用數(shù)學庫函數(shù):
sqrt(…)sin(…)abs(…)
……fstreamFilestreamprocessingassertC-basedlibraryforassertionprocessingiomanipFormattedinput/output(I/O)requestsctypeC-basedlibraryforcharactermanipulationsmathC-basedlibraryfortrigonometricandlogarithmicfunctions函數(shù)原型
程序中,如果調用自定義的函數(shù),且函數(shù)定義在后,調用在先,則必須在調用函數(shù)之前有函數(shù)原型聲明。voidsubfun1(…);//原型聲明main(){
┆subfun1(…);//函數(shù)調用┆}voidsubfun1(…)//函數(shù)定義{
…}
函數(shù)原型
如果是函數(shù)定義在先,調用在后,則不必進行函數(shù)原型聲明。因為編譯器已經(jīng)從函數(shù)定義得到關于函數(shù)的信息。voidsubfun1(…)//函數(shù)定義{
…}intmain(){
┆subfun1(…);//函數(shù)調用┆}
函數(shù)原型
源文件中,如果在所有函數(shù)定義體之外聲明函數(shù)原型,則該函數(shù)可被位于其原型聲明之后的所有函數(shù)調用。voidsubfun1(…);//原型聲明intmain(){
┆subfun1(…);//函數(shù)調用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調用┆}voidsubfun1(…)//函數(shù)定義{
…}intmain(){voidsubfun1(…);//函數(shù)原型聲明
┆
subfun1(…);//函數(shù)調用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調用,┆}voidsubfun1(…){
…}錯誤,編譯器不識別sunfun1標識符。intmain(){ floatcalc(float
x,float
y,char
opr); floata,b;charopr;
cout<<"輸入四則運算表達式:";
cin>>a>>opr>>b;
if(opr=='+'||opr=='-'||opr=='*'||opr=='/')
cout<<setw(5)<<setprecision(4)<<a<<opr <<setw(5)<<setprecision(4)<<b<<"=" <<setw(5)<<setprecision(4)對被調函數(shù)的聲明【例5-8】計算并輸出兩個數(shù)的和、差、積、商。<<calc(a,b,opr)<<endl; else
cout<<"非法運算符!"<<endl; return0;}floatcalc(float
x,float
y,char
opr){
switch(opr) { case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y); }}5.3C++中的特殊函數(shù)C++中的函數(shù)相對于C語言中的函數(shù)有些方便的擴展,下面介紹三種C++中的特殊函數(shù),在C語言中是沒有的。5.3.1重載函數(shù)
重載函數(shù)也是函數(shù)的一種特殊情況。C++允許幾個功能類似函數(shù)同名,但這些同名函數(shù)的形式參數(shù)必須不同,稱這些同名函數(shù)為重載函數(shù)。例:int
max(intx,inty){returnx>y?x:y;}floatmax(floatx,floaty){returnx>y?x:y;}各重載函數(shù)形式參數(shù)的不同是指參數(shù)的個數(shù)、類型或順序彼此不同,不包括參數(shù)標識符的不同。如:①int
max(inta,intb){returna>b?a:b;}②int
max(intx,inty){returnx>y?x:y;}③int
max(intx,inty,intz){return(x>y?x:y)>z?(x>y?x:y):z;}①②實際是一個函數(shù),如果寫在同一個文件中,編譯時會出現(xiàn)編譯錯誤。若①③或②③在同一個文件中可形成重載函數(shù)。編譯器將以形式參數(shù)個數(shù)的不同來認定和區(qū)分重載函數(shù)。【例5-9】編程求f(x,y)的值,程序在主函數(shù)中實現(xiàn)x、y值的輸入及結果的輸出,計算功能實現(xiàn)使用重載函數(shù)。#include<iostream>usingnamespacestd;floatfun(float
x,floaty);floatfun0(floatx); //重載函數(shù)floatfun0(floatx,floaty); //重載函數(shù)intmain(){ floatx,y;
cout<<"請按順序輸入f(x,y)中的x和y:";
cin>>x>>y;
cout<<"f("<<x<<","<<y<<")="<<fun(x,y);
cout<<endl; return0;}floatfun(floatx,floaty){
if(x<0) return0;elseif(y<0) returnfun0(x);else returnfun0(x,y);}floatfun0(floatx){
return(x*x);}floatfun0(floatx,floaty){
return(x*x+y*y);}在使用重載函數(shù)時需要注意下面三點:(1)
編譯器不以形式參數(shù)的標識符區(qū)分重載函數(shù)。例int
max(inta,intb);int
max(intx,inty);編譯器認為這是同一個函數(shù)聲明兩次,編譯時出錯。(2)
編譯器不以函數(shù)類型區(qū)分重載函數(shù)。floatfun(int
x,inty);int
fun(int
x,inty);如果函數(shù)名和形式參數(shù)表相同,只是函數(shù)類型不同,編譯器同樣認為它們是同一個函數(shù)聲明兩次,編譯出錯。(3)
不應該將完成不同功能的函數(shù)寫成重載函數(shù),破壞程序的可讀性。重載函數(shù)常用于實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題,
5.3.2內聯(lián)函數(shù)
函數(shù)調用時,系統(tǒng)首先要保存主調函數(shù)的相關信息,再將控制轉入被調函數(shù),這些操作增加了程序執(zhí)行的時間開銷。C++提供的內聯(lián)函數(shù)形式可以減少函數(shù)調用的額外開銷(時間空間開銷),特別是一些常用的短小的函數(shù)適合采用內聯(lián)函數(shù)形式。內聯(lián)函數(shù)
內聯(lián)函數(shù)的定義形式:inline函數(shù)類型函數(shù)名(形式參數(shù)表){函數(shù)體}
【例5-10】使用內聯(lián)函數(shù)編寫上例5-9。#include<iostream>usingnamespacestd;inlinefloatfun0(floatx){
return(x*x);}inlinefloatfun0(floatx,floaty){
return(x*x+y*y);}floatfun(float
x,floaty){
if(x<0) return0;elseif(y<0) returnfun0(x);else returnfun0(x,y);}intmain(){ floatx,y;
cout<<"請按順序輸入f(x,y)中的x和y:";
cin>>x>>y;
cout<<"f("<<x<<","<<y<<")="<<fun(x,y);
cout<<endl; return0;}內聯(lián)函數(shù)之所以能夠減少函數(shù)調用時的系統(tǒng)空間和時間開銷,是因為系統(tǒng)在編譯程序時就已經(jīng)把內聯(lián)函數(shù)的函數(shù)體代碼插入到相應的函數(shù)調用位置,成為主調函數(shù)內的一段代碼,可以直接執(zhí)行,不必再轉換流程控制權。這樣的結構,自然節(jié)省了時間和空間開銷,但使得主調函數(shù)代碼變長。一般是只把短小的函數(shù)寫成內聯(lián)函數(shù)。注意:(1)內聯(lián)函數(shù)體不能包含循環(huán)語句、switch語句和異常接口聲明。(2)內聯(lián)函數(shù)要先定義,后調用。因為編譯器需要用內聯(lián)函數(shù)的函數(shù)體代碼替換對應的函數(shù)調用。如果內聯(lián)函數(shù)不符合要求,編譯器就將內聯(lián)函數(shù)當一般函數(shù)處理。5.3.3默認參數(shù)值的函數(shù)
具有默認參數(shù)值的函數(shù)是一種特殊的函數(shù)形式,C++允許函數(shù)的形式參數(shù)有默認值。例如:計算圓面積的函數(shù):double
CircleArea(double
radius=1.0){
const
double
PI=3.14;
return
PI*radius*radius;}
調用具有默認參數(shù)值的函數(shù)時,如果提供實際參數(shù)值,則函數(shù)的形參值取自實際參數(shù);如果不提供實際參數(shù)值,函數(shù)的形參采用默認參數(shù)值。例如調用CircleArea函數(shù):#include<iostream>using
namespace
std;void
main(){
cout<<CircleArea(10.0)<<endl;//提供實際參數(shù)值
cout<<CircleArea()<<endl;//不提供實際參數(shù)值}默認參數(shù)值函數(shù)如果有多個參數(shù),而其中只有部分參數(shù)具有默認值,則這些具有默認值的參數(shù)值應該位于形參表的最右端?;蛘哒f,形參表中具有默認參數(shù)值的參數(shù)的右邊,不能出現(xiàn)沒有默認值的參數(shù)。例如:int
CuboidVolume(intlength=1,intwidth=1,intheight=1);//正確int
CuboidVolume(intlength,intwidth=1,intheight=1);//正確int
CuboidVolume(intlength,intwidth,intheight=1);//正確
int
CuboidVolume(intlength=1,intwidth,intheight=1);//錯誤int
CuboidVolume(intlength,intwidth=1,intheight);//錯誤int
CuboidVolume(intlength=1,intwidth=1,intheight);//錯誤如果默認參數(shù)值函數(shù)是先聲明,后定義的,則在聲明函數(shù)原型時就指定默認參數(shù)值。如果函數(shù)定義在先(無需原型聲明),則在函數(shù)定義的形參表中指定默認值。5.4函數(shù)模板模板是C++中的通用程序模塊。在這些程序模塊中有一些數(shù)據(jù)類型是不具體的,或者說是抽象的。當這些抽象的數(shù)據(jù)類型更換為不同的具體數(shù)據(jù)類型以后,就會產(chǎn)生一系列具體的程序模塊。這些抽象的數(shù)據(jù)類型稱為“參數(shù)化類型”(parameterizedtypes)。C++中的模板包括函數(shù)模板和類模板。函數(shù)模板會產(chǎn)生一系列參數(shù)類型不同的函數(shù)。類模板則會產(chǎn)生一系列不同參數(shù)的類。函數(shù)模板實例化后產(chǎn)生的函數(shù),稱為模板函數(shù)。類模板實例化后產(chǎn)生的類,稱為模板類。本節(jié)介紹函數(shù)模板。5.4.1函數(shù)模板的定義函數(shù)模板定義的一般格式
template<typename參數(shù)化類型名1,…,typename參數(shù)化類型名n>函數(shù)返回類型函數(shù)名(形式參數(shù)列表){ 函數(shù)體 }【例5-11】函數(shù)模板的定義和使用:定義和使用確定3個數(shù)據(jù)的最大值函數(shù)模板。程序如下:#include<iostream>usingnamespacestd;template<typenameT1,typenameT2,typenameT3>T1sum_value(T1x,T2y,T3z){ returnx+y+z; }intmain(){ chara='0';intb=1;doublec=3.2;
cout<<sum_value(a,b,c)<<endl;
cout<<sum_value(b,a,c)<<endl;
cout<<sum_value(c,b,a)<<endl; return0;}實例化的模板函數(shù)。相應的模板函數(shù)的原型可以寫為:
charsum_value(char
x,int
y,doublez);int
sum_value(char
x,int
y,doublez);doublesum_value(char
x,int
y,doublez);在這個例子中,參數(shù)化類型名T1作為函數(shù)類型,決定函數(shù)返回值的數(shù)據(jù)類型,同時定義為函數(shù)第一個形參x的數(shù)據(jù)類型,主函數(shù)中傳遞過來的第一個實參的數(shù)據(jù)類型會作為函數(shù)的類型,因此第一個結果是按照字符型數(shù)據(jù)輸出;第二個結果是按照整型數(shù)數(shù)據(jù)輸出;第三個結果是按照雙精度實型數(shù)據(jù)輸出。5.4.2重載函數(shù)模板函數(shù)模板不支持參數(shù)的自動轉換。對于函數(shù)模板:template<typenameT1>T1sum_value(T1x,T1y,T1z) { returnx+y+z; }如果用以下的方式來調用:cout<<sum_value(2,3.2,21)<<endl;在編譯時會出現(xiàn)編譯錯誤。也就是參數(shù)T1,不可以既是整型,又是實型。例如,需要為sum_value(2,3.2,21)單獨定義對應類形變量的比較函數(shù)如下:
int
sum_value(int
x,float
y,intz){ returnx+y+z; }這樣就形成了函數(shù)模板和非模板函數(shù)的重載。
template<typenameT1>T1sumvalue(T1x,T1y,T1z)
和
intmaxvalue(intx,floaty,intz)重載函數(shù)模板的匹配過程是按照以下的順序來進行的:①首先尋找函數(shù)名和參數(shù)能準確匹配的非模板函數(shù);②如果沒有找到,選擇參數(shù)可以匹配的函數(shù)模板;③如果還不成功,通過參數(shù)自動轉換,選擇非模板函數(shù)。5.5局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內部變量):在函數(shù)內或復合語句內定義的變量以及形參。作用域:函數(shù)內或復合語句內。5.5.1局部作用域和局部變量【例5-12】分析下面程序的運行結果及變量的作用域。程序如下:#include<iostream>usingnamespacestd;voidsub(int
a,intb){
intc;/*c是局部變量,在sub函數(shù)內有效*/ a=a+1;b=b+2;c=a+b;
cout<<"sub:a="<<a<<",b="<<b<<",c="<<c<<endl;}intmain(){
inta=1,b=2,c=3; /*a、b、c是局部變量,在main函數(shù)內有效*/
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl;
sub(a,b);
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl; { inta=2,b=2; /*a、b是局部變量,在分程序內有效*/ c=4;
cout<<"comp:a="<<a<<",b="<<b<<",c="<<c<<endl; }
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl; return0;}5.5.2全局作用域和全局變量全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結束。如在其作用域內的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內,同名全局變量暫時不起作用?!纠?-13】分析下面程序的運行結果及變量的作用域。程序如下:#include<iostream>usingnamespacestd;intmaximum;intminimum;voidfun(int
x,int
y,intz){
intt; t=x>y?x:y; maximum=t>z?t:z; t=x<y?x:y; minimum=t<z?t:z;}intmain(){
int
a,b,c;
cout<<"輸入數(shù)據(jù)a,b,c:";
cin>>a>>b>>c;
fun(a,b,c);
cout<<"maximum="<<maximum<<endl;
cout<<"minimum="<<minimum<<endl;}5.6變量的生存期和存儲類別5.6.1變量的生存期變量的生存期:變量在內存中占據(jù)存儲空間的時間。程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量5.6.2變量的存儲類別變量的屬性數(shù)據(jù)類型:決定為變量分配內存單元的長度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲類別:決定了變量的生存期,給它分配在哪個存儲區(qū)。變量定義語句的一般形式存儲類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動的)register(寄存器的)static(靜態(tài)的)
extern(外部的)1.自動變量(auto類別)main()
{int
x,y;…}main()
{auto
int
x,y;…}自動變量等價可省局部變量可以定義為自動變量。⑴內存分配調用函數(shù)或執(zhí)行分程序時在動態(tài)存儲區(qū)為其分配存儲單元,函數(shù)或分程序執(zhí)行結束,所占內存空間即刻釋放。⑵變量的初值定義變量時若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調用時執(zhí)行一次賦值操作。⑶生存期在函數(shù)或分程序執(zhí)行期間。⑷作用域自動變量所在的函數(shù)內或分程序內。自動變量【例5-15】自動變量的使用。#include<iostream>usingnamespacestd;int
f(inta){
ints=5; /*等價于:autoints=5;*/ s+=a; returns;}intmain(){
int
i,a=1; /*等價于:autoint
i,a=1;*/
for(i=0;i<3;i++) { a+=f(a);
cout<<a<<endl; } return0;}運行結果:719432.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。static
int
a;main(){floatx,y;…}f(){static
int
b=1;……}全局靜態(tài)變量局部靜態(tài)變量自動變量不能省⑴內存分配編譯時,將其分配在內存的靜態(tài)存儲區(qū)中,程序運行結束釋放該單元。⑵靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0;若定義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值。⑶生存期整個程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結束。靜態(tài)變量【例5-16】靜態(tài)變量的使用。#include<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版養(yǎng)老社區(qū)商品房預售合同范本3篇
- 2024版學校教育基金管理合同:助力夢想的翅膀2篇
- 2024版工廠租賃安全協(xié)議責任書(含安全生產(chǎn)責任)3篇
- 手術室產(chǎn)后大出血護理查房
- 2024版供應鏈金融擔保合同及擔保人權利義務界定2篇
- 內蒙古大學創(chuàng)業(yè)學院《用戶界面設計與評價》2023-2024學年第一學期期末試卷
- 2024年度衛(wèi)星通信設備研發(fā)與地面站建設合同3篇
- 2024版年度財務審計與顧問綜合服務合同
- 2024萬科物業(yè)服務合同范本包含社區(qū)電商運營與配送服務3篇
- 2024年城市改造土方運輸及場地平整合同3篇
- 競賽試卷(試題)-2023-2024學年六年級下冊數(shù)學人教版
- 2024糖尿病酮癥酸中毒診斷和治療課件
- 2024-淘寶商城入駐協(xié)議標準版
- 中國青少年籃球訓練教學大綱-姚維
- 長方體的表面積說課市公開課一等獎省賽課微課金獎課件
- 中國石油天然氣集團有限公司投標人失信行為管理辦法(試行)
- 中醫(yī)藥與中華傳統(tǒng)文化智慧樹知到期末考試答案2024年
- 產(chǎn)品質量保證函模板
- 模板支撐腳手架集中線荷載、施工總荷載計算表(修正)
- GB/T 43700-2024滑雪場所的運行和管理規(guī)范
- 新媒體部門崗位配置人員架構圖
評論
0/150
提交評論