编译器可以确认4种不同类型的作用域:文件作用域、函数作用域、代码块作用域、原型作用域。
代码块作用域:可以被这个代码块中的所有语句访问。注意:当代码块处于嵌套状态,声明于内层代码块的标识符的 作用域到达该代码块的尾部;当代码块不是嵌套的时,声明于每个代码块的变量无法被另一个代码块 访问。
文件作用域:任何在所有代码块之外声明的标识符都具有文件作用域,他表示这些标识符从声明之处到源文件结尾都 是可以访问的。
原型作用域:只适用于在函数原型中声明的参数名。
函数作用域:它只适用于语句标签,语句标签用于沟通语句。希望不要用到这个知识点。(1965年,Dijkstra提出从 高级语言中取消goto语句。)
下边,来看一道例题:
#define _CRT_SECURE_NO_WARNINIGS 1
#include<stdio.h>
int count = 3; //声明全局变量,该变量在整个文件中都有效,也就是具有文件作用域。
int main()
{
int i, sum, count = 2; //具有代码块作用域,在整个main函数中有效。
for (i = 0, sum = 0;i < count;i += 2, count++)//循环开始(第0次):count = 2,i= 0,sum=0
//循环第一次:i=2,count = 3,满足i<count
//循环第二次:i= 4,count=4,不满足count>i退出循环体
{
static int count = 4;
count++;//具有代码块作用域,在整个for循环中有效。循环开始:count = 5;循环第一次:count = 6
if (i % 2 == 0)
{
extern int count;//声明外部变量,在连接过程中,编译器会在函数函数之外找到全局变量的声明。count = 3
count++;//count =4; count = 5
sum += count;//sum = 4 sum=9+5 =14
}
sum += count;//此处count = 5(是for循环里的count),sum=9 ;;; sum= 14+6=20
}
printf("%d %d",sum,count);//出循环时,sum = 20,count = 4
system("pause");
return 0;
}