作用域與存儲(chǔ)類型_第1頁
作用域與存儲(chǔ)類型_第2頁
作用域與存儲(chǔ)類型_第3頁
作用域與存儲(chǔ)類型_第4頁
作用域與存儲(chǔ)類型_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章作用域與存儲(chǔ)類型5.1.1作用域作用域是變量在程序中可引用的區(qū)域。作用域共分成塊作用域、文件作用域、函數(shù)聲明(原型)作用域、函數(shù)作用域、類作用域五種。1.塊作用域{}復(fù)合語句是一個(gè)塊。復(fù)合語句中定義的變量,作用域僅在該復(fù)合語句中。5.1.1作用域【例5.1】輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。#include<stdio.h>voidmain(){inta,b; //a、b具有函數(shù)作用域

cout<<"輸入兩整數(shù):"<<endl;cin>>a>>b;cout<<“a="<<a<<'\t'<<"b="<<b<<endl;if(b>=a){ intt;//t具有塊作用域

t=a;a=b;b=t;//交換a,b的值

}cout<<"a="<<a<<'\t'<<"b="<<b<<endl;//t已經(jīng)無效}for(intk=1;k<=2;k++)S=MAX(4,6);[存儲(chǔ)類別]數(shù)據(jù)類型變量名,……在定義全局變量時(shí)也加說明符static。所謂“文件包含”是指將另一個(gè)源文件的內(nèi)容合并到當(dāng)前程序中。將文件名用雙引號括起來的,用來包含用戶自己定義的放在當(dāng)前目錄或其他目錄下的頭文件或其他源文件。{intm,n;函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時(shí),其中的形參作用域只在聲明中,即作用域結(jié)束于右括號。但其他文件如果要使用這個(gè)文件中定義的全局變量,必須在使用前用“extern”作外部聲明,外部聲明通常放在文件的開頭。max=x;min=x;//設(shè)定最大數(shù)和最小數(shù)intm=find();但其他文件如果要使用這個(gè)文件中定義的全局變量,必須在使用前用“extern”作外部聲明,外部聲明通常放在文件的開頭。Voidmain()if(b>=a)作用域是變量在程序中可引用的區(qū)域。5.1.1作用域2.文件作用域文件作用域也稱全局作用域。定義在所有函數(shù)之外的變量,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)源文件結(jié)束。文件中定義的全局變量和函數(shù)都具有文件作用域。3.函數(shù)聲明作用域函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時(shí),其中的形參作用域只在聲明中,即作用域結(jié)束于右括號。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個(gè)數(shù)和類型,形參名可省略。

5.1.1作用域4.函數(shù)作用域函數(shù)中定義的變量,包括形參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),也稱作函數(shù)域。5.類作用域在介紹類和對象時(shí),可知類作用域是指類定義范圍(包括類的聲明部分和相應(yīng)成員函數(shù)實(shí)現(xiàn)整個(gè)范圍)。在該范圍內(nèi),類的成員函數(shù)對數(shù)據(jù)成員有無限訪問權(quán)限。5.1.2局部變量與全局變量一、局部變量

下列變量是局部變量:1、在一個(gè)函數(shù)內(nèi)部定義的變量;2、函數(shù)的形式參數(shù);

3、在某個(gè)復(fù)合語句中定義的變量;

floatf1(inta){intb,c;……}Voidmain(){intm,n;……}b,c有效m,n有效a有效main(){inta,b,c;……{intd;d=a+b;……}}d有效5.1.2局部變量與全局變量一、局部變量

說明:1、局部變量只在自己范圍內(nèi)有效;2、如果局部變量的有效范圍有重疊,則有效范圍小的優(yōu)先;

main(){inta,b,c;

……{intc;c=a+b;……}}局部優(yōu)先C有效二、全局變量

5.1.2局部變量與全局變量在函數(shù)之外定義的變量(外部變量)是全局變量全局變量的有效范圍是:從定義變量的位置開始到源文件結(jié)束7.7局部變量與全局變量二、全局變量

例:編寫一個(gè)函數(shù)實(shí)現(xiàn)同時(shí)返回10個(gè)數(shù)的最大和最小值分析:用一個(gè)函數(shù)返回兩個(gè)數(shù)據(jù),除了用函數(shù)值外,可以借助于全局變量

可見,全局變量可以減少函數(shù)的參數(shù)5.1.2局部變量與全局變量#include<stdio.h>#include<math.h>#include<stdlib.h>intmin;//全局變量minintfind(){intmax,x;x=rand()%101+100;//產(chǎn)生一個(gè)[100,200]之間的隨機(jī)數(shù)xprintf(“%d”,x);max=x;min=x;//設(shè)定最大數(shù)和最小數(shù)

for(inti=1;i<10;i++) {x=rand()%101+100; //再產(chǎn)生一個(gè)[100,200]之間的隨機(jī)數(shù)x printf(“%d”,x); if(x>max)max=x;//若新產(chǎn)生的隨機(jī)數(shù)大于最大數(shù),則進(jìn)行替換

if(x<min)min=x;//若新產(chǎn)生的隨機(jī)數(shù)小于最小數(shù),則進(jìn)行替換

} returnmax;}voidmain(){intm=find();printf(“\n最大數(shù):%d,最小數(shù):%d\n“,max,min);}7.7局部變量與全局變量二、全局變量

說明:1、利用全局變量可以在函數(shù)間傳遞參數(shù)。2、應(yīng)盡量少用全局變量3、如果全局變量與局部變量同名,則局部變量優(yōu)先

5.1.3動(dòng)態(tài)變量與靜態(tài)變量全局變量和局部變量:變量的作用域靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量:變量的存儲(chǔ)類別,即生存期

內(nèi)存中供用戶使用的存儲(chǔ)空間包括:①程序區(qū)②靜態(tài)存儲(chǔ)區(qū):編譯時(shí)分配空間③動(dòng)態(tài)存儲(chǔ)區(qū):執(zhí)行時(shí)分配空間

變量或函數(shù)的屬性:

作業(yè):P90:四、3、4P108:一、27】用自動(dòng)變量與靜態(tài)局部變量求三個(gè)整數(shù)的和。2局部變量與全局變量第5章作用域與存儲(chǔ)類型if(b>=a)1】輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。externinta,b;intmax(intx,inty)帶參數(shù)的宏定義{intc;m=m+x+y;x=rand()%101+100;//產(chǎn)生一個(gè)[100,200]之間的隨機(jī)數(shù)x文件中定義的全局變量和函數(shù)都具有文件作用域。voidmain()#include<stdio.通常auto可以省略5.2變量的存儲(chǔ)類別1、自動(dòng)類型:存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū),用auto說明

如:intfunc1(inta){autointb,c=3;……}通常auto可以省略

形參a,變量b、c都是自動(dòng)變量調(diào)用該函數(shù)時(shí),系統(tǒng)給它們分配存儲(chǔ)空間,函數(shù)調(diào)用結(jié)束時(shí)自動(dòng)釋放存儲(chǔ)空間。

自動(dòng)類型、寄存器類型的變量屬于動(dòng)態(tài)變量;靜態(tài)類型、外部類型的變量屬于靜態(tài)變量。5.2變量的存儲(chǔ)類別1、自動(dòng)類型:【例5.5】使用自動(dòng)變量的示例。#include<stdio.h>voidmain(){intx=5,y=10;//自動(dòng)變量x,yfor(intk=1;k<=2;k++){autointm=0,n=0;//自動(dòng)變量m,nm=m+1;n=n+x+y;printf("m=%d\tn=%d\n“,m,n);} }5.2變量的存儲(chǔ)類別2、寄存器類型(register)

①計(jì)算機(jī)中的寄存器的個(gè)數(shù)是有限的

②寄存器變量對寄存器的占用是動(dòng)態(tài)的

③有的系統(tǒng)將寄存器變量轉(zhuǎn)化為自動(dòng)變量處理,而有的系統(tǒng)會(huì)自動(dòng)設(shè)置寄存器變量

5.2變量的存儲(chǔ)類別3、靜態(tài)類型(static)

①靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在程序整個(gè)運(yùn)行期間都不釋放存儲(chǔ)空間。②靜態(tài)局部變量在編譯時(shí)賦初值(僅賦一次值)③如果定義靜態(tài)局部變量時(shí)沒有賦初值,編譯時(shí)會(huì)自動(dòng)賦初值④靜態(tài)局部變量只能在定義它的函數(shù)內(nèi)被引用(它存在但不能被其它函數(shù)使用)

打印1到5的階乘(1)靜態(tài)局部變量5.2變量的存儲(chǔ)類別【例5.6】自動(dòng)變量與靜態(tài)局部變量的區(qū)別。#include<stdio.h>voidf(){intx=0;//初始化多次,棧中分配、相當(dāng)于autointx=0;staticinty=3;//靜態(tài)局部變量,僅初始化一次,靜態(tài)區(qū)分配

x=x+1;y=y+1;printf(“%d\t%d\n”,x,y);}voidmain(){inti;for(i=0;i<3;i++)f();}5.2變量的存儲(chǔ)類別【例5.7】用自動(dòng)變量與靜態(tài)局部變量求三個(gè)整數(shù)的和。#include<stdio.h>voidf(intx,inty){intm=0;//自動(dòng)變量

staticintn=0;//靜態(tài)局部變量,此處也可staticintn;m=m+x+y;n=n+x+y;printf("m=%d\tn=%d\n“,m,n);}voidmain(){inti=5,j=10,k;for(k=1;k<=3;k++)f(i,j);}printf("m=%d\tn=%d\n“,m,n);4、外部類型(extern)③有的系統(tǒng)將寄存器變量轉(zhuǎn)化為自動(dòng)變量處理,而有的系統(tǒng)會(huì)自動(dòng)設(shè)置寄存器變量函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時(shí),其中的形參作用域只在聲明中,即作用域結(jié)束于右括號。S=MAX(4,6);2、如果局部變量的有效范圍有重疊,則有效范圍小的優(yōu)先;定義格式:extern類型變量名;intfind()函數(shù)中定義的變量,包括形參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),也稱作函數(shù)域。文件包含命令的一般形式為:(3)宏被定義以后,一般不能再重新定義。文件中定義的全局變量和函數(shù)都具有文件作用域。voidmain()2局部變量與全局變量文件名一般是以.5.2變量的存儲(chǔ)類別(2)靜態(tài)全局變量在定義全局變量時(shí)也加說明符static。程序由一個(gè)源程序文件實(shí)現(xiàn),一個(gè)全局變量和一個(gè)靜態(tài)全局變量是沒區(qū)別的。在多文件組成的程序中,一個(gè)全局變量和一個(gè)靜態(tài)全局變量在使用上是不同的,其他文件通過外部變量聲明可以使用一個(gè)全局變量,但卻無法使用靜態(tài)全局變量,靜態(tài)全局變量只能被定義它的文件所獨(dú)享。特點(diǎn):1)與全局變量基本相同,只是其作用范圍(即作用域)是定義它的程序文件,而不是整個(gè)程序。(2)靜態(tài)全局變量屬于靜態(tài)存儲(chǔ)類別的變量,所以它在程序一開始運(yùn)行時(shí),就被分配固定的存儲(chǔ)單元,所以其生存期是整個(gè)程序運(yùn)行期間。(3)使用靜態(tài)全局變量的好處是同一程序的兩個(gè)不同的源程序文件中可以使用相同名稱的變量名,而互不干擾。2、應(yīng)盡量少用全局變量所謂“文件包含”是指將另一個(gè)源文件的內(nèi)容合并到當(dāng)前程序中。intt;//t具有塊作用域3、靜態(tài)類型(static)在定義全局變量時(shí)也加說明符static。在文件中定義靜態(tài)全局變量n,在含有main函數(shù)的文件中又定義全局變量n,分析兩者是否有聯(lián)系?{autointm=0,n=0;//自動(dòng)變量m,n#include<stdio.S=4>6?4:6;#include<stdio.1、自動(dòng)類型:存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū),用auto說明復(fù)合語句中定義的變量,作用域僅在該復(fù)合語句中。如果在程序中出現(xiàn)如下語句:定義格式:extern類型變量名;autointb,c=3;5.2變量的存儲(chǔ)類別(2)靜態(tài)全局變量【例5.8】編寫一個(gè)含兩個(gè)源程序文件程序(多文件程序見節(jié))。在文件中定義靜態(tài)全局變量n,在含有main函數(shù)的文件中又定義全局變量n,分析兩者是否有聯(lián)系?#include<stdio.h>intn;voidfn();voidmain(){ n=20; printf(“%d\n”,n); fn();}#include<stdio.h>//不能省略staticintn;//定義靜態(tài)全局變量nvoidfn(){n=n+1;printf(“%d\n”,n);}5.2變量的存儲(chǔ)類別4、外部類型(extern)定義格式:

extern

類型變量名;在由多個(gè)源程序文件組成的程序中,如果一個(gè)文件要使用另一個(gè)文件中定義的全局變量,這些源程序文件之間通過外部類型的變量進(jìn)行溝通。在一個(gè)文件中定義的全局變量缺省為外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果要使用這個(gè)文件中定義的全局變量,必須在使用前用“extern”作外部聲明,外部聲明通常放在文件的開頭。5.2變量的存儲(chǔ)類別4、外部類型(extern)【例5.9】將另一文件中的全局變量a,b定義為本文件外部變量的示例。第一個(gè)文件內(nèi)容如下:/*文件名:exemple5_9_1.c*/inta=20,b=7;//全局變量a,bintmax(intx,inty){returnx>y?x:y;}第二個(gè)文件內(nèi)容如下:/*文件名:exemple5_9_2.c*/#include<stdio.h>externinta,b;//外部變量a,bexternintmax(intx,inty);voidmain(){intc;c=max(a,b);printf("max=%d\n“,c);}存儲(chǔ)類別小結(jié)1、變量的定義方法

[存儲(chǔ)類別]數(shù)據(jù)類型變量名,……2、變量的劃分

編譯預(yù)處理C語言提供的預(yù)處理功能主要有以下3種:(1)宏定義命令(2)文件包含命令(3)條件編譯命令為了與一般C語句相區(qū)別,這些命令以符號“#”開頭,而且末尾不包含分號。預(yù)處理命令可放在程序開頭、中間和末尾,主要由需要而定。習(xí)慣上預(yù)編譯命令都是放在程序的開頭。宏定義宏定義命令是將一個(gè)標(biāo)識符定義為一個(gè)字符串,該標(biāo)識符被稱為宏名,被定義的字符串稱為替換文本。宏定義命令有兩種格式:簡單的宏定義帶參數(shù)的宏定義1.宏定義的一般形式為:#define宏名字符串如:注意:(1)#define、宏名和字符串之間一定要有空格。(2)宏名一般用大寫字母表示,以區(qū)別于普通標(biāo)識符

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論