C语言学习之变量作用域与生命周期

C语言中变量的使用是十分广泛的,如果开发人员对变量的理解不够清晰的话,可能会导致一些奇奇怪怪的BUG,下面我们就来简单聊一些C语言中变量的一些概念。(本节讲的变量全都是普通变量,没有用static关键字修饰)

  • 1、全局变量的作用域和生命周期

作用域顾名思义就是一个变量的使用范围有多大,而生命周期意思就是一个变量在什么时候被释放。变量在C语言中分为全局变量和局部变量,先来讨论全局变量的作用域。
全局变量,从字面意思来说就是能在大范围内使用的变量。下面通过一段代码来说明全局变量的一些特点。

程序1:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

//定义全局变量
int globe_A = 10;
extern void function(void);
int main(void)
{
	printf("globe_A = %d\r\n",globe_A);
	function();
	printf("globe_A = %d\r\n",globe_A);
	return 0;
}

程序2:

extern int globe_A;
void function(void)
{
	globe_A = 20;
}

首先程序1先定义一个全局变量globe_A初始化为10,在main函数中先打印出globe_A的值,然后调用function函数,最后再打印出globe_A的值。
function函数定义在程序2,在程序2中先外部声明globe_A,然后在function中修改globe_A为20。接下来看一下运行效果
在这里插入图片描述
从运行结果来看,globe_A从最开始的10到最后被修改为20。所以从这里可以说明全局变量的其中一个特点就是能被其他文件引用,其他文件只需要通过externa关键字对全局变量进行声明,就可以使用这个全局变量。

接下来再看一段程序
程序3:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

//定义全局变量

int globe_A = 10;
extern void function(void);

int main(void)
{
	globe_B = 30;
	printf("globe_A = %d\r\n",globe_A);
	function();
	printf("globe_A = %d\r\n",globe_A);
	return 0;

}
int globe_B = 20;

这段程序在main函数后面定义一个全局变量globe_B,然后在main函数中修改这个全局变量。来看一下编译结果。
在这里插入图片描述
编译结果提示globe_B未定义,这就说明了全局变量的另一个特点就是全局变量的使用范围是从该全局变量定义开始的地方一直到文件末尾,所以全局变量的定义一般都是从文件的最开始就定义全局变量,以便在整个文件都可以使用。
当然如果你不想在文件的开头就定义全局变量,你可以在开头的地方进行声明,然后在别的地方进行定义。就像下面的程序一样。

程序4:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

//定义全局变量

int globe_A = 10;
extern void function(void);
extern int globe_B;  // 先声明全局变量
int main(void)
{
	globe_B = 30;
	printf("globe_A = %d\r\n",globe_A);
	function();
	printf("globe_A = %d\r\n",globe_A);
	printf("globe_B = %d\r\n",globe_B);
	return 0;

}

int globe_B = 20; // 定义全局变量

该程序在程序3的基础上,在文件的前面先用extern关键字声明了全局变量globe_B,这样在编译的时候就没有错误,而且这个变量还可以正常使用。
在这里插入图片描述
总结全局变量的特点
生命周期:全局变量的生命周期是从系统上电时候就一直存在,除非系统关机,否则一直存在。
作用域:全局变量的作用域是从全局变量定义或者声明开始,一直到文件末尾。
注意:由于全局变量可以被其他文件引用和修改,所以当一个工程中全局变量过多时,会导致整个工程的维护难度变大。因为同一个工程中的全局变量可以互相引用,所以会出现一个全局变量被修改,导致其他文件中的同一个全局变量的值也会被修改,这就很容易出现一些未知的BUG,小编有一次在开发一个产品时就是因为一个全局被修改,导致其他引用这个全局变量的地方出现了一个隐藏BUG,最后出现了产品大批量投诉。

  • 2、局部变量的作用域和生命周期
    局部变量从意思来理解就是只能在一个局部范围被使用的变量,它和全局变量有很大的区别,下面通过几个程序来说明局部变量的特点。
    程序5:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

void func()
{
	int local_A = 10;  // 定义局部变量
	printf("local_A = %d\r\n",local_A);
}

int main(void)
{
	func();
	local_A = 20;
	return 0;
}

在程序5中,func函数内定义了一个局部变量local_A,然后打印出local_A的值。然后在main函数中试图想修改局部变量local_A的值。来看一下编译结果。
在这里插入图片描述
编译报错,提示在第18行local_A这个变量没有被定义。这就说明局部变量的第一个特点是作用域只存在函数中。局部变量只能在本函数中使用,其他函数不能引用。

程序6:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

int globe_A = 10; // 定义全局变量
void func()
{
	int local_A = 10;  // 定义局部变量
	local_A++;
	globe_A++;
	printf("local_A = %d globe_A = %d\r\n",local_A,globe_A);
}


int main(void)
{
	int cnt = 0;
	while(cnt++ < 10)
	{
		func();
		sleep(1);
	}
	
	return 0;	
}

在程序6中,func函数分别对对局部变量local_A和全局变量globe_A进行加1,然后打印出local_A和globe_A的值。main函数则将func函数执行10次。来看一下运行结果。
在这里插入图片描述
可以看到local_A的值永远为11,而globe_A的值却是每次都会在前一次的基础上加1。这就说明了局部变量的第二个特点就是当函数退出时,局部变量会被释放掉,不会保存上一次的值,每调用一次函数时,局部变量都会被重新定义。
总结局部变量的特点:
作用域:只能在函数中使用,其他函数不能引用。不能用extern关键字在其他文件声明局部变量
生命周期:当函数退出时,局部变量就会被释放掉

  • 3、全局变量和局部变量补充说明
    当一个程序文件中全局变量和局部变量名字相同时,程序会优先使用局部变量。
    程序7:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

int value = 10;

int main(void)
{
	int value = 20;
	printf("value = %d\r\n",value);
	return 0;
}

在程序7中,程序一开始就定义了一个全局变量value,初始值为10。在main函数中也定义了一个名字为value的局部变量,初始值为20。运行程序观察结果。
在这里插入图片描述
程序运行的结果是打印出value的值为20。这就说明当一个程序文件中出现全局变量和局部变量名字重复的时候,函数会优先使用局部变量的值。一般在工程中要避免出现全局变量和局部变量名字相同的情况,这样做不仅使代码变得难懂,而且容易出错。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值