C语言变量的作用域

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

总结

  1. 在函数外定义的变量,拥有文件作用域。
  2. 在函数内定义的变量,拥有块作用域,其寿命仅限于该函数体内。
  3. 拥有文件作用域的变量,其寿命是从定义变量到整个程序执行结束。
  4. 当变量同名时,处在内层作用域的变量是“可见的”,而处在外层作用域的变量会被“隐藏起来”。