
static变量
电子维修-物业维修
2023年2月19日发(作者:暖通设计规范)静态变量的⽣存期和作⽤域
静态变量的类型说明符是static。静态变量当然是属于静态存储⽅式,但是属于静态存储⽅式的量不⼀定就是静态变量,例如外部变量虽属
于静态存储⽅式,但不⼀定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。对于⾃动变量,它属于动态
存储⽅式。但是也可以⽤static定义它为静态⾃动变量,或称静态局部变量,从⽽成为静态存储⽅式。由此看来,⼀个变量可由static进⾏
再说明,并改变其原有的存储⽅式。
1.静态局部变量
在局部变量的说明前再加上static说明符就构成静态局部变量。例如:
staticinta,b;
staticfloatarray[5]={1,2,3,4,5};
静态局部变量属于静态存储⽅式,它具有以下特点:
(1)静态局部变量在函数内定义,但不象⾃动变量那样,当调⽤时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的⽣
存期为整个源程序。
(2)静态局部变量的⽣存期虽然为整个源程序,但是其作⽤域仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。退出该函数
后,尽管该变量还继续存在,但不能使⽤它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统⾃动赋以0值。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统⾃动赋予0值。⽽对⾃动变量不赋初值,则其值是不定的。根据静态局部变量
的特点,可以看出它是⼀种⽣存期为整个源程序的量。虽然离开定义它的函数后不能使⽤,但如再次调⽤定义它的函数时,它⼜可继续使
⽤,⽽且保存了前次被调⽤后留下的值。因此,当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。虽
然⽤全局变量也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤,因此仍以采⽤局部静态变量为宜。
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储
⽅式。这两者在存储⽅式上并⽆不同。这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮
静态的全局变量在各个源⽂件中都是有效的。⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它
源⽂件中不能使⽤它。由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起
错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。把全局变量改变为静态变量后是
改变了它的作⽤域,限制了它的使⽤范围。因此static这个说明符在不同的地⽅所起的作⽤是不同的。应予以注意。
3、静态函数和静态变量
除范围之外,变量还有存活期,在这⼀期间变量能够保持它们的值。在应⽤程序的存活期内⼀直保持模块级变量和公⽤变量的值。但是,对
于Dim声明的局部变量以及声明局部变量的过程,仅当过程在执⾏时这些局部变量才存在。通常,当⼀个过程执⾏完毕,它的局部变量的
值就已经不存在,⽽且变量所占据的内存也被释放。当下⼀次执⾏该过程时,它的所有局部变量将重新初始化。
但可将局部变量定义成静态的,从⽽保留变量的值。在过程内部⽤Static关键字声明⼀个或多个变量,其⽤法和Dim语句完全⼀样:
StaticDepth
例如,下⾯的函数将存储在静态变量Accumulate中的以前的运营总值与⼀个新值相加,以计算运营总值。
FunctionRunningTotal(num)
StaticApplesSold
ApplesSold=ApplesSold+num
RunningTotal=ApplesSold
EndFunction
如果⽤Dim⽽不⽤Static声明ApplesSold,则以前的累计值不会通过调⽤函数保留下来,函数只会简单地返回调⽤它的那个相同值。
在模块的声明段声明ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种⽅法⼀旦改变变量的范围,过程就不再对
变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。
4、声明所有的局部变量为静态变量
为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上Static关键字。例如:
StaticFunctionRunningTotal(num)
这就使过程中的所有局部变量都变为静态,⽆论它们是⽤Static、Dim或Private声明的还是隐式声明的。可以将Static放在任何Sub
或Funtion过程头的前⾯,包括事件过程和声明为Private的过程。