C语言之作用域和存储期

目录

作用域和标识符的可见性

存储期

自动存储期

 静态存储期


 要创建大规模的程序,必须首先要了解作用域和存储期。

作用域和标识符的可见性

#include<stdio.h>

int x = 75;//A:文件作用域

void print_x(void)
{
	printf("x=%d\n", x);
}

int main()
{
	int i;//B:块作用域
	int x = 999;
	
	print_x();
	
	printf("x=%d\n", x);
	
	for(i = 0; i < 5; i++)
	{
		int x = i * 100;//C:块作用域
		printf("x=%d\n", x);
	}
	return 0;
}

在A处声明的变量x,初始值是75,是在函数外进行的声明,所以这个x拥有文件作用域。

因此,在程序执行时屏幕上会输出x=75

 在main函数中声明的变量x在main函数结尾之前都是通用的,但在main函数中存在两个变量x如下:

int x = 999;
	int x = i * 100

它们的显示遵循以下规则:

当同名变量都被赋予了块作用域的时候内层的变量是可见的,而外层的变量会被隐藏起来。

例如:在for语句执行的5次循环中显示的是在for语句程序块中声明的变量x,而非x=999

 在函数外声明的变量x,与在main函数内声明的变量x,在显示时适用于以下规则:

如果两个同名变量分别拥有文件作用域和块作用域在,那么只拥有块作用域的变量是可见的,而拥有文件作用域的变量会被隐藏起来。

例如:在拥有文件作用域的x=75与块作用域的x=999,程序在执行时显示的999

被声明的标识符是从被写出来的时候开始生效的,因此即使把int x =999改为int x = x,作为初始值的x也是被声明出来的x绝非拥有文件作用域的那个x,所以x的初始值不是75,而是不确定的值。


存储期

在函数中声明的变量,并不是从程序的开始到程序的结束始终有效的,变量的生存期也就是寿命有两种,它们可以通过存储期这个概念体现。

/*自动存储期和静态存储期*/
#include<stdio.h>

int fx = 0;//静态存储期和文件作用域

void func(void)
{
	static int sx = 0;//静态存储期和块作用域
	int		   ax = 0;//自动存储期和快作用域
	
	printf("%3d%3d%3d", ax++, sx++, fx++);
}
int mian()
{
	int i;
	
	puts(" ax sx fx ");                 /*    运 行 结 果                                   
                                                                
	puts("-----------");                      ax sx fx
	                                          -----------
	for(i = 0; i < 5; i++)                    0   0  0       
		func();                               0   1  1    
	puts("-----------");                      0   2  2
                                              0   3  3
	return 0;                                 0   4  4
                                              -----------  */
	                        
}

在函数func中声明了sx和ax两个变量,但是在声明sx时我们使用了存储类说明符static,所以用相同的值进行初始化并递增,最终ax和sx的值不相同。

自动存储期

在函数中不使用存储类说明符static而定义出的变量被赋予了自动存储期,它有以下特性:

程序执行到变量声明的时候就会创建出相应的变量,执行到包含该声明的程序块结尾 { ,该变量就会消失。

也就是说,该变量拥有短暂的生命。另外,如果不显式的进行初始化,该变量会被赋予不确定的值。

 静态存储期

在函数中使用存储类说明符static定义出来的变量,或者在函数外进行声明的变量都会被赋予静态存储期,它具有以下特性:

在程序开始执行的时候,具体来说是在main函数执行之前的准备阶段被创建出来,在程序结束时消失。

该变量拥有永久的生命,另外如果不显式的进行初始化,该变量会自动初始化为0.

学习了这些知识后我们对上面的程序拆开进行更加详细的处理:

a. main函数在执行之前的状态拥有静态存储期的变量fx和sx,在程序开始的时候被创建出来并被        初始化为0,在整个程序执行的过程中它们一直存在于同一处。

b.当main函数开始执行的时候创建出了拥有自动存储期的变量i。

c.在main函数中调用函数func时,创建了变量ax并将其初始化为0,这样变量ax sx fx分别从0的值    递增为1.

d.当函数func执行结束后变量ax就消失了

e.main函数中的i自动增加,再次调用func函数,这时变量ax再次被创建出来并被初始化为0,于是    这三个变量的值分别为0 1 1,在显示处理结束后自动递增为1 2 2

main函数总共调用了5次func函数,拥有永久寿命的变量fx和sx会一直增加,而只存在于函数func的变量ax,由于每次创建的时候都会被初始化为0,所以递增5次后还是0(原因就是执行到该声明的程序块结尾时变量ax也就消失,再次调用时又被初始化为0).

 f.main函数执行结束的同时变量i也会消失。


下一节我们会学习相关的基本数据类型的知识。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学海无涯.苦作舟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值