一,作用域分为局部作用域与全局作用域
1、局部作用域
通俗来讲,在花括号内的均为局部作用域。
2、全局作用域
所有的函数都有全局作用域。全局变量便在全局作用域,指定义在函数之外的变量,全局变量可以
为本文件之外的其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
全局变量前可加‘ g_ ’前缀。全局变量若未被初始化,则自动以位模式清零。
3.可见性规则:所有的标识符都符合以下四条规则
(1)标识符必须先定义,再使用。
(2)在同一作用域当中,不能定义同名标识符。
(3)在没有包含关系的作用域中,定义的同名标识符互不影响。
(4)在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见。
(简称就近原则,哪个近用哪个的值)
二、变量的生存期
可理解为从变量的产生到销毁的过程,分为静态生存期、动态生存期。
1、静态生存期
变量生存时间与程序运行周期相同。
包括全局变量、static所修饰的局部变量。
注意:static修饰后的变量,不会随着函数结束而被销毁。
2、动态生存期
例如循环里的局部变量。
结果为11,12
结果为11,11。
是因为下面的变量未被static修饰,仍为动态生存期,在fn结束后被销毁,第二次调用时重新创建一个局部变量被赋值10,执行结束后仍为11;
而上面被static修饰后,变量从动态生存期变为静态;在fn结束后仍然存在因此在第二次调用fn时变量值仍未第一次调用结束后的11,第二次结束后结果为12。
这便是下面要说的static的第一个用法。
三、修饰变量
1、auto 变量
函数的形参在函数中定义的变量,调用时系统会为其分配存储空间,调用结束后会自动释放存储空间。一般都省略不写,隐含为自动存储类别。
2、static 变量
作用:(1)对于局部变量,前缀表示将该局部变量从原先的动态生存期修改为静态生存期。
(2)当放在全局变量或者函数前时,表示限制该函数只能在本.c文件中使用。
3、register 变量
建议而非命令;它将放在存储器内的值放在CPU的寄存器中完成更加高速的存取。
4、extern 变量
外部声明,定义只能一次,声明可以无数次。头文件(~.h)当中只放声明,不放定义,不参与编译。自己定义的头文件用双引号引起来。
函数的声明:extern int add(int a,int b);
在main.c文件中可以包含一个头文件用来专门声明。
可以用 -E选项(只做预处理,不编译)来观察main.c中预处理后的内容。
标签:变量,作用域,可见,生存期,static,标识符,定义 From: https://blog.csdn.net/2401_84308772/article/details/140749259