转载

static 静态变量

静态变量的类型关键字是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态 局部变量 ,从而成为静态存储方式。 由此看来,一个变量可由static进行再说明,并改变其原有的存储方式

静态 局部变量 属于 静态存储方式 ,它具有以下特点:

(1)静态局部变量在函数内定义,但不像 自动变量 那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

(2)静态局部变量的生存期虽然为整个源程序,但是其 作用域 仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。

(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对 自动变量 不赋初值,则其值是不定的。 根据静态 局部变量 的特点, 可以看出它是一种生存期为整个 源文件 的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用 全局变量 也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

举例说明

给读者一个简单直白的例子(区别静态 局部变量 和动态局部变量):

#include<stdio.h> int fun(int n) {     static int f=1;     f=f*n;     return f; } void main() {     int i;     for(i=1;i<=5;i++)     printf("fun(%d)=%d/n",i,fun(i)); } 

这里的运行结果是:

fun(1)=1 fun(2)=2 fun(3)=6 fun(4)=24 fun(5)=120 

说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:

#include<stdio.h> int fun(int n) {     int f=1;     f = f * n;     return f; } void main() {     int i;     for(i=1;i<=5;i++)         printf("fun(%d)=%d/n",i,fun(i)); } 

程序的运行结果是:

fun(1)=1 fun(2)=2 fun(3)=3 fun(4)=4 fun(5)=5 

也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。

———————————————————————————————————————————————

下面是java例子:

public class StaticTest{     static int f=1;//java声明静态变量要放到函数外面,结果和c的结果一样     int fun(int n){         f = f * n;         return f;     }     public static void main(String[] args){         StaticTest st = new StaticTest();         for(int i = 1; i <= 5; i++)             System.out.println(st.fun(i));     } } 

---------------------------------------------------------------------------------------------------------------

Module Module1

Public a As Integer ‘未赋值的情况下a的值是0

End Module

Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

a += 1

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

a += 1

MsgBox(a) ’结果是2(0+1+1)因为是a是模块级静态 全局变量 ,所以按按钮3以后,直到关闭程序a的值都会是2

End Sub

End Class

原文  http://www.cnblogs.com/caffe/p/5185678.html
正文到此结束
Loading...