读书人

【从新上本科】关于“static”关键字的

发布时间: 2013-03-26 09:54:34 作者: rapoo

【重新上本科】关于“static”关键字的点滴

在面试的时候,考察语言基础的时候,有时候会遇到问题“static关键字的作用是什么”,以及相关的问题。这篇文章里面尽可能总结的全面一点。


对于c语言。

static可以修饰c语言的变量,表示静态变量,有个很cool的(或者和普通变量很不一样)的属性,就是他的生命周期与当前的生命周期一样。典型的场景就是:在函数中定义了static变量,在函数外面还能够引用这个变量。经常用来作计数器。这是函数内外一种通信的方式,就像全局变量一样。

引申的问题1:为什么具有这种属性?即为什么生命周期和当前程序一样。

答:普通变量分配在栈上,随着函数推出,栈清空,变量销毁;而静态变量的存储区域在程序的静态存储区,就像全局存储区、堆、栈、代码区一样,是一种程序的存储区域。这种存储区在程序load的时候被初始化,变量的生命开始,直到程序结束,才随着程序的销毁而被销毁。从存储的角度来看变量生命周期,就很显然了;其实那种“计数”特性只是一种副产品,从这个角度看是自然而然的事情。

小问题

静态存储区什么时候被初始化?

答:很多人对“编译时”和“运行时”会搞混。很容易回答在程序编译的时候,被初始化成xxx。其实是在运行时被初始化,就是在程序刚刚load的时候,确切地说是在进入main函数之前。如果没有默认值,则默认值是0x00。那么编译的时候编译器为静态变量做什么了?其实只是在符号表(记录内部变量的表格)中做了记录,如果只是声明而没有定义,则只有符号表的入口,编译的时候并不为它分配空间;反之,则分配空间并用该初始值作为它的值。

引申的问题2:静态变量和全局变量有什么区别?

答:相同的是生命周期,那有什么不同呢?这里和c对static的要求有关了。static的主要作用是控制被修饰变量(函数)的可见范围,即,只对当前文件可见,对外文件不可见。而全局变量是全局可见,全局可引用的。

例如:

class xxx{     static     {     ......     }}

在类做初始化的时候,会首先执行static中的语句。static程序块儿,也只能访问static变量,更像一个没有函数签名的构造函数,可能把名字省了吧,反正大家都知道那是干啥的。


暂时总结到这里吧。

读书人网 >编程

热点推荐