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

本文速览

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

正文

上面的文字是本篇文章的总结,如果你能正确把握两者的差距,那么现在就可以滑到最下面给我一个三连了,么么哒(づ ̄ 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修饰的变量的所属作用域降低一个大级。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheXeler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值