要创建大规模的 C 语言程序,必须首先理解程序中变量的作用域和存储期。
变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的{ }的包围区域。
在程序块(一个{ }内)中声明的变量(一般称为局部变量),只在该程序块{ }中起作用。也就是说,一个变量从被声明的位置开始,到包含该变量声明的程序块最后的大括号为止,这一区间内是起作用的。这样的作用域称为块作用域。
而在 C 程序的 main( ) 函数以及其他自定义函数外面的程序开始部分声明的变量(一般称为全局变量),从声明位置开始,到该程序的结尾都是起作用的。这样的作用域称为文件作用域(如代码清单 1 中所示)。
代码清单 1:用变量 x 验证文件作用域和块作用域
#include <stdio.h>
#include <stdlib.h>
int x=10; // A:文件作用域/
/*--自定义函数--*/
void print_x(void)
{
printf("x=%d ",x);
}
/*--主函数--*/
int main( )
{
system("color 70");
int i;
int x = 999; //B:块作用域/
print_x( ); //-----(1)
printf("//循环前print_x函数打印(1)\n");
printf("x=%d ",x); //-----(2)
printf("//循环前printf函数打印(2)\n");
for(i=0;i<5;i++)
{
int x = i*100; //C:块作用域/
printf("x=%d",x); //-----(3)
printf(" //第%d轮循环(3)\n",i+1);
}
print_x( ); //-----(4)
printf("//循环后print_x函数打印(4)\n");
printf("x=%d ",x); //-----(5)
printf("//循环后printf函数打印(5)\n");
system("pause");
return 0;
}
运行结果:
x=10 //循环前print_x函数打印(1)
x=999 //循环前printf函数打印(2)
x=0 //第1轮循环(3)
x=100 //第2轮循环(3)
x=200 //第3轮循环(3)
x=300 //第4轮循环(3)
x=400 //第5轮循环(3)
x=10 //循环后print_x函数打印(4)
x=999 //循环后printf函数打印(5)
在代码清单 1 的程序中对变量 x 的声明共有三处:
在程序第 3 行声明的变量 x,它是在函数外面声明定义的,因而它是全局变量,具有文件作用域。其后的自定义函数 print_x 中输出的变量 x 就是上述全局变量 x,程序中每次调用该函数所输出的变量 x 都是该全局变量 x。因而在程序第 15 行 (1) 处和第 25 行 (4) 处调用函数 print_x( ) 输出的都是 x 的值 10。
在程序第 14 行声明的变量 x,是在 main( ) 函数内声明的,因而它具有块作用域,其作用范围直到 main( ) 函数结束。因而在程序第 17 行 (2) 处和第 27 行 (5) 处输出的都是 x 的值 999。
在程序第 21 行声明的变量 x,是在 for 语句的循环语句块中声明的,因而它具有块作用域,其作用范围仅限于 for 语句的循环块({ }内)。因而在程序第 22 行 (3) 处循环输出的都是 x 的值 0、100、200、300、400。