程序中定義了函數(shù)f,其中的變量j 說明為自動變量并賦予初始值為0.當(dāng)main中多次調(diào)用f時,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)用時繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行分析其執(zhí)行過程。
2.靜態(tài)全局變量
全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序, 當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。應(yīng)予以注意。
四、寄存器變量
上述各類變量都存放在存儲器內(nèi),因此當(dāng)對一個變量頻繁讀寫時,必須要反復(fù)訪問內(nèi)存儲器,從而花費大量的存取時間。為此,C語言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫,這樣可提高效率。寄存器變量的說明符是register。對于循環(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都將頻繁使用,因此可定義為寄存器變量。對寄存器變量還要說明以下幾點:
1. 只有局部自動變量和形式參數(shù)才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式。凡需要采用靜態(tài)存儲方式的量不能定義為寄存器變量。
2. 在Turbo C,MS C等微機上使用的C語言中, 實際上是把寄存器變量當(dāng)成自動變量處理的。因此速度并不能提高。 而在程序中允許使用寄存器變量只是為了與標(biāo)準(zhǔn)C保持一致。
3. 即使能真正使用寄存器變量的機器,由于CPU 中寄存器的個數(shù)是有限的,因此使用寄存器變量的個數(shù)也是有限的。
相關(guān)推薦:
2012年軟考系統(tǒng)分析師考試60天完美復(fù)習(xí)計劃
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |