静态变量static的定义
1,常量的使⽤
静态变量也可以⽤于存储。
具体来说,静态变量(全局变量及⾥定义的符号亦同)可⽤const,constant或final(根据语⾔决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且⽆法在改变。
通常将静态常量与⽂本⼀起置于的⽂本区域,⽽⾮常量数据则置于数据区;
⽽如若有需要,有些编译器还可选择为其开辟专⽤区;
为防⽌常数变量被错误的写⼊覆盖,亦可在这块区域启⽤内存保护机制。
静态局部变量
静态 属于 ,它具有以下特点:
(1)静态局部变量在函数内定义,但不像 那样,当调⽤时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的⽣存期为整个源程序。
(2)静态局部变量的⽣存期虽然为整个源程序,但是其 仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。退出该函数后, 尽管该变量还继续存在,但不能使⽤它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统⾃动赋值。数值型变量⾃动赋初值0,字符型变量赋空字符。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统⾃动赋予0值。⽽对 不赋初值,则其值是不定的。 根据静态的特点, 可以看出它是⼀种⽣存期为整个的量。虽然离开定义它的函数后不能使⽤,但如再次调⽤定义它的函数时,它⼜可继续使⽤, ⽽且保存了前次被调⽤后留下的值。 因此, 当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。虽然⽤ 也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤,因此仍以采⽤局部静态变量为宜。
举例说明
给读者⼀个简单直⽩的例⼦(区别静态 和动态局部变量):
1 2 3 4 5 6 7 8 9 10 11 12 13#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)); }
这⾥的运⾏结果是:
1 2 3 4 5fun(1)=1 fun(2)=2 fun(3)=6 fun(4)=24 fun(5)=120
说明f在加了static的类型限制之后,就相当于全局变量,函数调⽤完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。⽽如果不加static的类型限制,那么,会是什么结果呢,我们看下⾯的代码:
1 2 3 4 5 6 7#include<stdio.h> int fun(int n) {
int f=1;
f = f * n;
return f;
}
7 8 9 10 11 12 13}
void main()
{
int i;
for(i=1;i<=5;i++)
printf("fun(%d)=%d\n",i,fun(i)); }
程序的运⾏结果是:
1 2 3 4 5fun(1)=1 fun(2)=2 fun(3)=3 fun(4)=4 fun(5)=5
也就是说,这时函数fun中的变量f的⽣命周期就仅限于fun函数的范围内了,在main中每次传⼊新的参数i,f就会计算1*i的值并返回,⽽不会像之前那样不断的累乘了。
———————————————————————————————————————————————
下⾯是java例⼦:
1 2 3 4 5 6 7 8 9 10 11 12public class StaticTest{
static int f=1;//java声明静态变量要放到函数外⾯,结果和c的结果⼀样int fun(int n){
f = f * n;
return f;
}static修饰的变量
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。