靜態(tài)變量的類型說明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量,例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。對于自動變量,它屬于動態(tài)存儲方式。 但是也可以用static定義它為靜態(tài)自動變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲方式。
由此看來, 一個(gè)變量可由static進(jìn)行再說明,并改變其原有的存儲方式。
1. 靜態(tài)局部變量
在局部變量的說明前再加上static說明符就構(gòu)成靜態(tài)局部變量。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
靜態(tài)局部變量屬于靜態(tài)存儲方式,它具有以下特點(diǎn):
(1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動變量那樣,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失。靜態(tài)局部變量始終存在著,也就是說它的生存期為整個(gè)源程序。
(2)靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后,盡管該變量還繼續(xù)存在,但不能使用它。
(3)允許對構(gòu)造類靜態(tài)局部量賦初值。若未賦以初值,則由系統(tǒng)自動賦以0值。
(4)對基本類型的靜態(tài)局部變量若在說明時(shí)未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點(diǎn), 可以看出它是一種生存期為整個(gè)源程序的量。雖然離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用,而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個(gè)函數(shù)且要求在調(diào)用之間保留某些變量的值時(shí),可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達(dá)到上述目的,但全局變量有時(shí)會造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜
2.靜態(tài)全局變量
全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。這兩者的區(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)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。因此static 這個(gè)說明符在不同的地方所起的作用是不同的。應(yīng)予以注意。
靜態(tài)變量
除范圍之外,變量還有存活期,在這一期間變量能夠保持它們的值。在應(yīng)用程序的存活期內(nèi)一直保持模塊級變量和公用變量的值。但是,對于 Dim 聲明的局部變量以及聲明局部變量的過程,僅當(dāng)過程在執(zhí)行時(shí)這些局部變量才存在。通常,當(dāng)一個(gè)過程執(zhí)行完畢,它的局部變量的值就已經(jīng)不存在,而且變量所占據(jù)的內(nèi)存也被釋放。當(dāng)下一次執(zhí)行該過程時(shí),它的所有局部變量將重新初始化。
但可將局部變量定義成靜態(tài)的,從而保留變量的值。在過程內(nèi)部用 Static 關(guān)鍵字聲明一個(gè)或多個(gè)變量,其用法和 Dim 語句完全一樣:
Static Depth
例如,下面的函數(shù)將存儲在靜態(tài)變量 Accumulate 中的以前的運(yùn)營總值與一個(gè)新值相加,以計(jì)算運(yùn)營總值。
Function RunningTotal (num)
Static ApplesSold
ApplesSold = ApplesSold + num
RunningTotal = ApplesSold
End Function
如果用 Dim 而不用 Static 聲明 ApplesSold,則以前的累計(jì)值不會通過調(diào)用函數(shù)保留下來,函數(shù)只會簡單地返回調(diào)用它的那個(gè)相同值。
在模塊的聲明段聲明 ApplesSold,并使它成為模塊級變量,由此也會收到同樣效果。但是,這種方法一旦改變變量的范圍,過程就不再對變量排他性存取。由于其它過程也可以訪問和改變變量的值,所以運(yùn)營總值也許不可靠,代碼將更難于維護(hù)。
聲明所有的局部變量為靜態(tài)變量
為了使過程中所有的局部變量為靜態(tài)變量,可在過程頭的起始處加上 Static 關(guān)鍵字。例如:
Static Function RunningTotal (num)
這就使過程中的所有局部變量都變?yōu)殪o態(tài),無論它們是用 Static、Dim 或 Private 聲明的還是隱式聲明的。可以將 Static 放在任何 Sub 或 Funtion 過程頭的前面,包括事件過程和聲明為 Private 的過程。
文章出處:DIY部落(http://www.diybl.com/course/3_program/vc/vc_js/20090215/155523.html)