要创建大规模的 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。