作用域

作用域是指标识符可见性(可用性),即在程序代码中哪些位置可以访问该变量。

C语言共有四种作用域:

1.函数作用域

2.文件作用域

3.块作用域

4.函数原型作用域

函数作用域

标号:和goto关键字配合使用,标号是唯一具有函数作用域的标识符

:函数中任意标号在函数范围内均可访问。

例如:计算两个整数的和。

#include <stdio.h>
int sum(int a, int b){
goto mylabel;// 跳过以下代码
a = a+b;
b = a+b;
mylabel:return a+b;

}
int main(void){
printf("%d\n", sum(100,100));
return 0;
}

输出:​​200​

分析:sum函数直接跳到return语句完成两个参数的和计算,mylabel是标记,具有函数作用域,因此函数任意位置都可以访问,不需要先声明。

文件作用域

当声明的变量或其它标识符出现在块或函数声明形参表之外,该标识符声明之后具备文件作用域,在当前文件均可以访问。

例如:计算两个整数的和。

#include <stdio.h>
int a = 100;
int b= 100;
int main(void){
printf("%d\n", a+b);
return 0;
}

输出:​​200​

分析:变量a和b是全局变量,声明以后,在整个文件均可以访问。

块作用域

声明在{}块内或函数定义的形参表中的标识符具有块作用域,在当前块{}内可以访问。

例如:

{
int c = 0;
}

int sum(int a, int b){
int sum = 0;
sum = a+b;
return sum;
}

分析:

1.变量a和b是函数定义的形参变量,是块作用域

2.变量sum声明在函数{}块内,是块作用域

3.变量c同样是块作用域,sum函数无法访问c

函数原型作用域

当标识符出现在函数声明的参数中,而不是函数定义的形参中时,该参数标识符具备函数原型作用域,范围是在该函数声明结束为止。

例如:

int sum(int a, int b);

//分析:sum函数的声明,变量a和b是原型作用域,仅在该声明中有效,其它地方均无法访问。
int sum(int a, int b){
...
}

分析:注意区分sum函数的定义,定义是带{}的,此时变量a和b具有块作用域,因此在{}内可以访问。


变量作用域规则

•具有文件作用域的变量,是全局变量

•具有块作用域的变量是局部变量

变量作用域的起点是从变量的声明以后开始,终点根据作用域类型选择

•作用域覆盖原则是就近,不同作用域的变量标识符相同时,外层的变量标识符被屏蔽,就近访问当前作用域的标识符,当前作用域结束后,外层的变量标识符恢复可用

•全局变量定义时系统会默认初始化,局部变量系统不会初始化,建议变量均声明定义初始化后使用,全局变量使用内存的静态存储空间保存,局部变量会动态分配在栈中

例如:

# include <stdio.h>
int a = 100;
int main(void){
{
int a = 200;
printf("%d\n",a);
}
printf("%d\n",a);
return 0;
}

运行结果

输出:
200
100

-----------------END-----------------