C语言变量的作用域
要创建大规模的 C 语言程序,必须首先理解程序中变量的作用域和存储期。
变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的
在程序块(一个
而在 C 程序的 main( ) 函数以及其他自定义函数外面的程序开始部分声明的变量(一般称为全局变量),从声明位置开始,到该程序的结尾都是起作用的。这样的作用域称为文件作用域(如代码清单 1 中所示)。
代码清单 1:用变量 x 验证文件作用域和块作用域
运行结果:
在代码清单 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 语句的循环块(
变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的
{ }
的包围区域。在程序块(一个
{ }
内)中声明的变量(一般称为局部变量),只在该程序块{ }
中起作用。也就是说,一个变量从被声明的位置开始,到包含该变量声明的程序块最后的大括号为止,这一区间内是起作用的。这样的作用域称为块作用域。而在 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。
总结
- 在函数外定义的变量,拥有文件作用域。
- 在函数内定义的变量,拥有块作用域,其寿命仅限于该函数体内。
- 拥有文件作用域的变量,其寿命是从定义变量到整个程序执行结束。
- 当变量同名时,处在内层作用域的变量是“可见的”,而处在外层作用域的变量会被“隐藏起来”。