 |
 |
培訓(xùn)信息 |
|
|
|
 |
 |
贊助商 |
|
|
|
|
 |
 |
C語(yǔ)言初學(xué)者入門(mén)講座 第十講 函數(shù)(5) |
|
|
| C語(yǔ)言初學(xué)者入門(mén)講座 第十講 函數(shù)(5) |
| 作者:佚名 來(lái)源:不詳 錄入:Admin 更新時(shí)間:2008-7-27 16:04:51 點(diǎn)擊數(shù):2 |
【字體:
】 |
三、靜態(tài)變量
靜態(tài)變量的類(lèi)型說(shuō)明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲(chǔ)方式,但是屬于靜態(tài)存儲(chǔ)方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲(chǔ)方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱(chēng)靜態(tài)全局變量。 對(duì)于自動(dòng)變量,前面已經(jīng)介紹它屬于動(dòng)態(tài)存儲(chǔ)方式。 但是也可以用static定義它為靜態(tài)自動(dòng)變量,或稱(chēng)靜態(tài)局部變量,從而成為靜態(tài)存儲(chǔ)方式。 由此看來(lái), 一個(gè)變量可由static進(jìn)行再說(shuō)明,并改變其原有的存儲(chǔ)方式。
1. 靜態(tài)局部變量
在局部變量的說(shuō)明前再加上static說(shuō)明符就構(gòu)成靜態(tài)局部變量。
例如:
static int a,b; static float array[5]={1,2,3,4,5};
靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)方式,它具有以下特點(diǎn):
(1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動(dòng)變量那樣,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失。靜態(tài)局部變量始終存在著,也就是說(shuō)它的生存期為整個(gè)源程序。
(2)靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。
(3)允許對(duì)構(gòu)造類(lèi)靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時(shí)已作過(guò)說(shuō)明。若未賦以初值,則由系統(tǒng)自動(dòng)賦以0值。
(4)對(duì)基本類(lèi)型的靜態(tài)局部變量若在說(shuō)明時(shí)未賦以初值,則系統(tǒng)自動(dòng)賦予0值。而對(duì)自動(dòng)變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點(diǎn), 可以看出它是一種生存期為整個(gè)源程序的量。雖然離開(kāi)定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個(gè)函數(shù)且要求在調(diào)用之間保留某些變量的值時(shí),可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達(dá)到上述目的,但全局變量有時(shí)會(huì)造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜。
[例5.15]
main() { int i; void f(); /*函數(shù)說(shuō)明*/ for(i=1;i<=5;i++) f(); /*函數(shù)調(diào)用*/ } void f() /*函數(shù)定義*/ { auto int j=0; ++j; printf("%d\n",j); }
程序中定義了函數(shù)f,其中的變量j 說(shuō)明為自動(dòng)變量并賦予初始值為0。當(dāng)main中多次調(diào)用f時(shí),j均賦初值為0,故每次輸出值均為1,F(xiàn)在把j改為靜態(tài)局部變量,程序如下:
main() { int i; void f(); for (i=1;i<=5;i++) f(); } void f() { static int j=0; ++j; printf("%d\n",j); } void f() { static int j=0; ++j; printf("%d/n",j); }
由于j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時(shí)繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行分析其執(zhí)行過(guò)程。
2.靜態(tài)全局變量
全局變量(外部變量)的說(shuō)明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。 這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序, 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。因此static 這個(gè)說(shuō)明符在不同的地方所起的作用是不同的。應(yīng)予以注意。
四、寄存器變量
上述各類(lèi)變量都存放在存儲(chǔ)器內(nèi), 因此當(dāng)對(duì)一個(gè)變量頻繁讀寫(xiě)時(shí),必須要反復(fù)訪問(wèn)內(nèi)存儲(chǔ)器,從而花費(fèi)大量的存取時(shí)間。 為此,C語(yǔ)言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時(shí),不需要訪問(wèn)內(nèi)存,而直接從寄存器中讀寫(xiě), 這樣可提高效率。寄存器變量的說(shuō)明符是register。 對(duì)于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。
[例5.16]
求∑200i=1imain()
{ register i,s=0; for(i=1;i<=200;i++) s=s+i; printf("s=%d\n",s); }
本程序循環(huán)200次,i和s都將頻繁使用,因此可定義為寄存器變量。對(duì)寄存器變量還要說(shuō)明以下幾點(diǎn):
1. 只有局部自動(dòng)變量和形式參數(shù)才可以定義為寄存器變量。因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲(chǔ)方式。凡需要采用靜態(tài)存儲(chǔ)方式的量不能定義為寄存器變量。
2. 在Turbo C,MS C等微機(jī)上使用的C語(yǔ)言中, 實(shí)際上是把寄存器變量當(dāng)成自動(dòng)變量處理的。因此速度并不能提高。 而在程序中允許使用寄存器變量只是為了與標(biāo)準(zhǔn)C保持一致。3. 即使能真正使用寄存器變量的機(jī)器,由于CPU 中寄存器的個(gè)數(shù)是有限的,因此使用寄存器變量的個(gè)數(shù)也是有限的。
三、靜態(tài)變量
靜態(tài)變量的類(lèi)型說(shuō)明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲(chǔ)方式,但是屬于靜態(tài)存儲(chǔ)方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲(chǔ)方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱(chēng)靜態(tài)全局變量。 對(duì)于自動(dòng)變量,前面已經(jīng)介紹它屬于動(dòng)態(tài)存儲(chǔ)方式。 但是也可以用static定義它為靜態(tài)自動(dòng)變量,或稱(chēng)靜態(tài)局部變量,從而成為靜態(tài)存儲(chǔ)方式。 由此看來(lái), 一個(gè)變量可由static進(jìn)行再說(shuō)明,并改變其原有的存儲(chǔ)方式。
1. 靜態(tài)局部變量
在局部變量的說(shuō)明前再加上static說(shuō)明符就構(gòu)成靜態(tài)局部變量。
例如:
static int a,b; static float array[5]={1,2,3,4,5};
靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)方式,它具有以下特點(diǎn):
(1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動(dòng)變量那樣,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失。靜態(tài)局部變量始終存在著,也就是說(shuō)它的生存期為整個(gè)源程序。
(2)靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。
(3)允許對(duì)構(gòu)造類(lèi)靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時(shí)已作過(guò)說(shuō)明。若未賦以初值,則由系統(tǒng)自動(dòng)賦以0值。
(4)對(duì)基本類(lèi)型的靜態(tài)局部變量若在說(shuō)明時(shí)未賦以初值,則系統(tǒng)自動(dòng)賦予0值。而對(duì)自動(dòng)變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點(diǎn), 可以看出它是一種生存期為整個(gè)源程序的量。雖然離開(kāi)定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個(gè)函數(shù)且要求在調(diào)用之間保留某些變量的值時(shí),可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達(dá)到上述目的,但全局變量有時(shí)會(huì)造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜。
[例5.15]
main() { int i; void f(); /*函數(shù)說(shuō)明*/ for(i=1;i<=5;i++) f(); /*函數(shù)調(diào)用*/ } void f() /*函數(shù)定義*/ { auto int j=0; ++j; printf("%d\n",j); }
程序中定義了函數(shù)f,其中的變量j 說(shuō)明為自動(dòng)變量并賦予初始值為0。當(dāng)main中多次調(diào)用f時(shí),j均賦初值為0,故每次輸出值均為1,F(xiàn)在把j改為靜態(tài)局部變量,程序如下:
main() { int i; void f(); for (i=1;i<=5;i++) f(); } void f() { static int j=0; ++j; printf("%d\n",j); } void f() { static int j=0; ++j; printf("%d/n",j); }
由于j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時(shí)繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行分析其執(zhí)行過(guò)程。
2.靜態(tài)全局變量
全局變量(外部變量)的說(shuō)明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。 這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序, 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。因此static 這個(gè)說(shuō)明符在不同的地方所起的作用是不同的。應(yīng)予以注意。
四、寄存器變量
上述各類(lèi)變量都存放在存儲(chǔ)器內(nèi), 因此當(dāng)對(duì)一個(gè)變量頻繁讀寫(xiě)時(shí),必須要反復(fù)訪問(wèn)內(nèi)存儲(chǔ)器,從而花費(fèi)大量的存取時(shí)間。 為此,C語(yǔ)言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時(shí),不需要訪問(wèn)內(nèi)存,而直接從寄存器中讀寫(xiě), 這樣可提高效率。寄存器變量的說(shuō)明符是register。 對(duì)于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。
[例5.16]
求∑200i=1imain()
{ register i,s=0; for(i=1;i<=200;i++) s=s+i; printf("s=%d\n",s); }
本程序循環(huán)200次,i和s都將頻繁使用,因此可定義為寄存器變量。對(duì)寄存器變量還要說(shuō)明以下幾點(diǎn):
1. 只有局部自動(dòng)變量和形式參數(shù)才可以定義為寄存器變量。因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲(chǔ)方式。凡需要采用靜態(tài)存儲(chǔ)方式的量不能定義為寄存器變量。
2. 在Turbo C,MS C等微機(jī)上使用的C語(yǔ)言中, 實(shí)際上是把寄存器變量當(dāng)成自動(dòng)變量處理的。因此速度并不能提高。 而在程序中允許使用寄存器變量只是為了與標(biāo)準(zhǔn)C保持一致。3. 即使能真正使用寄存器變量的機(jī)器,由于CPU 中寄存器的個(gè)數(shù)是有限的,因此使用寄存器變量的個(gè)數(shù)也是有限的。 |
|
|
發(fā)表評(píng)論 告訴好友 打印此文 收藏此頁(yè) 關(guān)閉窗口 返回頂部 |
|
|
 |
 |
網(wǎng)友評(píng)論:(只顯示最新5條。) |
|
|
|
|
|