静态变量 static 的定义
2016-04-22 10:34
155 查看
1,常量的使用
静态变量也可以用于存储常数。
具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且无法在运行时改变。
编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;
而如若有需要,有些编译器还可选择为其开辟专用区;
为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,
而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
举例说明
给读者一个简单直白的例子(区别静态局部变量和动态局部变量):
这里的运行结果是:
说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:
程序的运行结果是:
也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。
———————————————————————————————————————————————
下面是java例子:
---------------------------------------------------------------------------------------------------------------
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
静态变量也可以用于存储常数。
具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且无法在运行时改变。
编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;
而如若有需要,有些编译器还可选择为其开辟专用区;
为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。
静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,
而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
举例说明
给读者一个简单直白的例子(区别静态局部变量和动态局部变量):
———————————————————————————————————————————————
下面是java例子:
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
相关文章推荐
- Daikon Forge GUI Library(dfgui)之Event Binding
- 性能测试负载模型(四)
- Hibernate Spatial处理空间数据
- Linux系统修改最大文件限制
- C#多线程编程
- 四种mysql存储引擎
- android layout属性介绍
- UI实时动态设计技巧
- xcode7 + opencv2.4.9
- oracle 操作记录
- 线性代数(笔记一) MIT公开课(来源网易云课堂)
- css 3种清除浮动方法
- JavaMail发送邮件
- 计算字符个数
- Markdown 语法说明 (简体中文版)
- Ui的基本特效--2
- 多线程异常 和 事务(一)
- iOS 本地通知 UILocationNotification
- Android xml text 预览属性
- jupyter使用