写点什么

浅论变量的作用域与变量的生存周期

用户头像
Integer
关注
发布于: 2021 年 04 月 10 日

本文速览

作用域是范围、生存周期是时间。

正文

上面的文字是本篇文章的总结,如果你能正确把握两者的差距,那么现在就可以滑到最下面给我一个三连了,么么哒(づ ̄ 3 ̄)づ~好吧,很显然这样的做法并不靠谱而且也不能让我收获三连,那么接下来我们就来细讲一下,这两个词的差距究竟在哪。

变量的作用域

变量的作用域,说白了就是你要在哪个范围你你呼唤变量的名字,变量才能回答你的提问。例如如下代码


int a;void func(){  int a;}
复制代码


在 func 函数的内部,两个 a 实际上都是有效而可用的,而在超出 func 函数的代码中,则只有全局的变量 int a 可以起效,这是由于局部声明变量只能在局部使用,通俗来讲可以总结成一句话:重点:在大括号里声明的变量只能在大括号里用简单来讲,局部作用域就是该变量所在的大括号内部、文件作用域就是全局变量所声明的文件内部,而全局作用域就是整个程序内都可以使用(需要配合 extern),作用域是一个空间概念。特别的,用 for 循环声明的变量的作用域不仅属于 for 的循环体,同时在 for 语句中也是有效的。

变量的生存周期

变量的生存周期也很好理解,就是变量本身会在内存之中存活多久,例如 C 中函数内部生命的局部变量,生存周期便只局限于函数内部。在函数结束的时候,普通变量所占用的空间会被程序自动释放,因此生存周期的重点在于执行时的指令,即生存周期是一个时间概念。额外补充:C 语言中的变量生存周期主要与储存位置有关,并因此分为两种:动态变量(形式参数和局部变量)和静态变量(register 关键字和 static 关键字),两者主要的差距在于在内存中所处的区域不同(动态变量储存在内存中的栈区,而静态变量则储存在静态区),也因此造成了两者实际上的生存周期不同(超出作用域即释放/程序结束时才会释放)。

static 运算符

在通常情况下,生存周期和作用域落实到 C 语言的源码之上,看起来是同一个范围(这也就是为什么两者容易被混淆),但是 static 关键字几乎就是对变量作用域与生存周期的改变考虑一下如下代码:


static int a; 
复制代码


Tips:static 关键字使用在全局变量上时会致使该变量只能在该文件内部使用。全局静态变量 a 的作用域被 static 修改为了文件作用域,因此其仅仅局限在文件内部,但全局变量的生存周期仍是等同于程序的运行周期。在这里,我们可以很明显和很易于理解的看到作用域与生存周期不同,再请考虑如下代码:


void func(){  static int a;}
复制代码


在这个案例中,局部静态变量 a 的作用域只有函数内部,但因为静态变量的特殊性,因此局部静态变量 a 的生存周期实质上是整个程序的生命周期,而不是与它的作用域一样仅仅局限在函数的内部。Tips:static 关键字使用在局部变量时会导致该变量的值不会在函数执行结束时被自动清空,且静态变量的初始化语句只会初始化一次,结束之后值仍然存在。这里,作用域和生存周期的差距同样一览无遗——两者虽然大部分情况下相统一,但并不是同一个概念。

总结

通过上述的讲解,我们可以得出三个结论:作用域就是一个变量可以被引用的范围。生命周期就是这个变量可以被引用的时间段。static 关键字的实质是使变量本身的生存周期拓展至整个程序的运行周期,且在能够递减的情况下将 static 修饰的变量的所属作用域降低一个大级。

发布于: 2021 年 04 月 10 日阅读数: 12
用户头像

Integer

关注

生年不满百,何怀千岁忧 2021.03.30 加入

C/C++工程师,专门研究犄角旮旯里的DeadTechnology

评论

发布
暂无评论
浅论变量的作用域与变量的生存周期