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也会消失。
下一节我们会学习相关的基本数据类型的知识。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!