變量作用域.doc_第1頁
變量作用域.doc_第2頁
變量作用域.doc_第3頁
變量作用域.doc_第4頁
變量作用域.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

數(shù)據(jù)的存儲(chǔ)類型一、變量的作用域變量的作用域是指變量有效性的范圍,與變量定義的位置密切相關(guān),作用域是從空間這個(gè)角度來描述變量的,按照作用域的不同,變量可分為局部變量和全局變量。1、局部變量在函數(shù)(或代碼塊)內(nèi)部定義的變量,也稱為內(nèi)部變量,局部變量只能在定義它的函數(shù)(或代碼塊)內(nèi)使用,其他函數(shù)均不能使用,局部變量的作用域,限于說明它的代碼塊內(nèi):從說明的地方開始至所在的代碼塊結(jié)束。注意,在同一個(gè)作用域內(nèi),不允許有同名的變量。例如:在同一個(gè)main()函數(shù)中,定義了三個(gè)數(shù)據(jù)類型和變量名均相同的局部變量i。在訪問這些變量i中,他們不會(huì)混淆,它們是三個(gè)不同的局部變量。它們各有自己的作用域。代碼如下:#include void main()int i=10;printf(The first i is %dn,i);printf(Enter a positive or negative number: );scanf(%d,&i); printf(In main() i=%dn,i);if(i0)int i=-10;printf(In if i is %dn,i);elseint i=20;printf(In else i is %dn,i);printf(The i in main() still is %dn,i);return;運(yùn)行結(jié)果:2、全部變量作用域是從定義點(diǎn)開始直到程序文件結(jié)束的變量,稱為全局變量。全局變量在程序的整個(gè)運(yùn)行過程中,都占用存儲(chǔ)單元。在一個(gè)函數(shù)中改變了全局變量的值,其他函數(shù)可以共享。全局變量相當(dāng)于起到在函數(shù)間傳遞數(shù)據(jù)的作用。例如:求一元二次方程的根:ax2 + bx + c =0代碼如下:#include #include float X1,X2,p,q,d; /定義全局變量void greater_than_zero(float,float); /函數(shù)聲明void equal_to_zero(float,float);void smaller_than_zero(float,float);void main()float a,b,c; /定義局部變量printf(Enter a,b,c: );scanf(%f%f%f,&a,&b,&c);d=b*b-4*a*c;if(d0)greater_than_zero(a,b);printf(X1 = %5.2ftX2 = %5.2fn,X1,X2);else if(d=0)equal_to_zero(a,b);printf(X1 = X2 = %5.2fn,X1);elsesmaller_than_zero(a,b);printf(X1 = %5.2f+%5.2fin,p,q);printf(X2 = %5.2f-%5.2fin,p,q);return;void greater_than_zero(float x,float y)X1=(-y+sqrt(d)/(2*x);X1=(-y-sqrt(d)/(2*x);return;void equal_to_zero(float x,float y)X1=(-y)/(2*x);return;void smaller_than_zero(float x,float y)p=-y/(2*x);q=sqrt(-d)/(2*x);return;二、變量的存儲(chǔ)類型運(yùn)行程序時(shí),系統(tǒng)在內(nèi)存中為數(shù)據(jù)的存儲(chǔ)開辟了兩塊區(qū)域:靜態(tài)數(shù)據(jù)區(qū)和動(dòng)態(tài)數(shù)據(jù)區(qū),分配在靜態(tài)數(shù)據(jù)區(qū)的變量稱為靜態(tài)變量,分配在動(dòng)態(tài)數(shù)據(jù)區(qū)的變量稱為動(dòng)態(tài)變量。在靜態(tài)和動(dòng)態(tài)兩大類的存儲(chǔ)方法中,C語言將變量的存儲(chǔ)類型分為四種,其存儲(chǔ)類型說明符和名稱如下:類型說明符 名稱auto 自動(dòng)變量static 靜態(tài)局部變量extern 外部變量register 寄存器變量在變量定義語句中,存儲(chǔ)類型符放在它所修飾的數(shù)據(jù)類型前面,一般形式為:存儲(chǔ)類型符 數(shù)據(jù)類型符 變量名表;1、自動(dòng)變量auto(動(dòng)態(tài)存儲(chǔ)類型)在函數(shù)內(nèi)定義的或在函數(shù)的語句塊內(nèi)定義的變量,若存儲(chǔ)類型省略或?qū)憺閍uto,都是自動(dòng)變量。此前的程序中使用的都屬于自動(dòng)變量。下面的兩條變量的定義語句是等價(jià)的:int a,b; 等價(jià)于:auto int a,b;注意:自動(dòng)變量在初始化前,或沒有賦值前,它的值是不確定的。2、靜態(tài)局部變量static(靜態(tài)存儲(chǔ)類型)靜態(tài)局部變量在靜態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)空間,在整個(gè)程序運(yùn)行期間都不釋放,變量的生存期是程序運(yùn)行期。雖然靜態(tài)局部變量的存儲(chǔ)空間在整個(gè)程序運(yùn)行中都保持著,但是,在它的作用域以外,仍然是不能被引用的。例如:函數(shù)numbers()是一個(gè)數(shù)發(fā)生器,每調(diào)用函數(shù)numbers()一次,產(chǎn)生一個(gè)整數(shù)。每個(gè)數(shù)的產(chǎn)生都是在上次產(chǎn)生的數(shù)的基礎(chǔ)上計(jì)算出來的。代碼如下:#include int numbers(void);main()int i;for(i=0;i10;i+)printf(%d ,numbers();return 0;int numbers(void)static int num1=0,num2=0; /定義靜態(tài)變量num1,num2num1 = num1 + 4;num2 = num2 + 7;return num2 % num1;運(yùn)行結(jié)果:3、寄存器變量register()如果變量在程序運(yùn)行中使用非常頻繁,則為存取該變量要消耗很多時(shí)間。利用寄存器操作速度快的特點(diǎn),將變量存放在CPU的寄存器中,可以提高程序的運(yùn)行效率。寄存器變量占用CPU的高速寄存器,不占用內(nèi)存單元。變量的值就保存在CPU的寄存器中。寄存器變量?jī)H能用于定義局部變量或是函數(shù)的形參,不能用于全局變量。在ANSI中,寄存器變量可以用于任何數(shù)據(jù)類型,但Turbo C+將寄存器變量只限用于char型和int型變量。例如:register int num;register型變量常用于作為循環(huán)控制變量,這是使用它的高速特點(diǎn)的最佳場(chǎng)合。比較下面兩個(gè)程序的運(yùn)算速度。main ( )register int temp, i;for ( i=0; i=30000; i+ )for ( temp=0; temp=100; temp+ ) ;printf (okn);#include main( )int temp, i;for ( i=0; i=30000; i+ )for ( temp=0; temp=100; temp+ ) ;printf (okn);三、全局變量的存儲(chǔ)定義1、外部全局變量全局變量是在函數(shù)外部定義的變量。變量在編譯時(shí)分配在靜態(tài)數(shù)據(jù)區(qū),生存期是程序的運(yùn)行期間。作用域是從定義點(diǎn)往后的所有定義的函數(shù)均有效。但當(dāng)函數(shù)內(nèi)的局部變量同名時(shí),局部變量是有效的,全局變量無效。如果在一個(gè)源文件中將某些變量定義為全局變量,而這些全局變量允許其他源文件中的函數(shù)引用的話,就需要有一種方法,把程序的全局變量告訴相關(guān)的模塊文件。解決的辦法是,在一個(gè)模塊文件中將變量定義為全局變量,而在引用這個(gè)變量的模塊文件中,用存儲(chǔ)類型符extern將其說明為外部變量。即extern定義符的作用只是將一個(gè)文件定義全局變量的作用域延伸到本源程序文件。例如:文件file1定義主函數(shù)和一個(gè)全局變量m。文件file2定義計(jì)算階乘的函數(shù)fact(),并說明變量m為外部的。/file1.c#include int fact(void);int m;void main()printf(Enter a number: );scanf(%d,&m);printf(%d!=%dn,m,fact();return;/file2.cextern int m;int fact(void)int result=1,i;for(i=1;i=m;i+)result=result+i;return(result);2、靜態(tài)全局變量靜態(tài)全局變量是在被定義的源程序文件以外是不可見的。也就是說,靜態(tài)全局變量只限于它所在的源程序文件中的函數(shù)引用,而不能被其他的源程序文件中的函數(shù)引用。其定義形式和局部靜態(tài)變量是一樣的,其一般形式為:static 數(shù)據(jù)類型 變量;注意:(1)靜態(tài)全局變量和靜態(tài)局部變量分配在靜態(tài)數(shù)據(jù)區(qū),生存期是程序運(yùn)行期。但靜態(tài)全局變量與靜態(tài)局部變量的作用域方面是不相同的;(2)靜態(tài)全局變量和全部變量在同一文件內(nèi)的作用域是一樣的,但全局變量的作用域可延伸到其他程序文件;(3)靜態(tài)局部變量與(動(dòng)態(tài))局部變量在作用域上相同的,但前者分配在靜態(tài)數(shù)據(jù)區(qū),后者分配在動(dòng)態(tài)數(shù)據(jù)區(qū),因而,他們的生存期是不同的。/第一個(gè)文件file1.cstatic int num1,num2;int numbers(void)num1 = num1 + 4;num2 = num2 + 7;return num2%num1;void num_init(int x1,int x2)num1 = x1;num2 = x2;/file2.c#include #include file1.cint numbers(void);void num_init(int,int);main(void)int i;num_init(5,6);for(i=0;i10;i+)printf(%d ,numbers();return 0;總結(jié):(1)一個(gè)數(shù)據(jù)包含有兩方面的屬性:數(shù)據(jù)類型和存儲(chǔ)類型;(2)從作用域的角度,有局部變量和全局變量,按存儲(chǔ)類型分,局部變量又分為自動(dòng)的、靜態(tài)的、寄存器三種;全局變量又分為靜態(tài)的和外部的兩種;(3)從生存期的角度,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)兩類,動(dòng)態(tài)存儲(chǔ)類的數(shù)據(jù)分配在動(dòng)態(tài)數(shù)據(jù)區(qū),是在進(jìn)入相應(yīng)的定義塊時(shí)分配存儲(chǔ)單元,如自動(dòng)變量、寄存器變量和形參;靜態(tài)存儲(chǔ)類的數(shù)據(jù)分配在靜態(tài)數(shù)據(jù)區(qū),是編譯時(shí)分配的,在整個(gè)程序運(yùn)行期間都存在,如靜態(tài)局部變量、靜態(tài)外部變量和全局變量。四、內(nèi)部函數(shù)和外部函數(shù)對(duì)于一個(gè)多源程序文件的C程序來說,根據(jù)一個(gè)函數(shù)能否調(diào)用其他源程序文件的函數(shù),將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。1、內(nèi)部函數(shù)函數(shù)只能被源程序文件的函數(shù)所調(diào)用,這樣的函數(shù)稱為內(nèi)部函數(shù),內(nèi)部函數(shù)也叫做靜態(tài)函數(shù),內(nèi)部函數(shù)在定義時(shí),要在函數(shù)類型前加上說明符static,例如:static char myfunction(char ch)如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。例如:void num_init()int numbers()在定義時(shí)雖然沒有用ex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論