变量的作用域

来源:互联网 发布:sql server 循环语句 编辑:程序博客网 时间:2024/04/27 19:58

一个C变量的作用域可以是代码块作用域、函数原型作用域,或者文件作用域。

一个代码块是包含在开始花括号和对应的结束花括号之间的一段代码。例如,整个函数体是一个代码块。一个函数内的任一负荷语句也是一个代码块。在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见。另外,函数的形式参数尽管在函数的开始花括号前进行定义,同样也具有代码块作用域,隶属于包含函数体的代码块。

 

例1:在一个内部代码块中声明的变量,其作用域只局限于该代码块:

double blocky(double cleo)   //cleo作用域的开始

{

      double patrick = 0.0;      //patrick作用域的开始

      int i;

      for (i=0; i<10; i++)

      {

          double q=cleo*i;  //q作用域的开始

          ...

          patrick *= q;        //q作用域的结束

      }

      ...

      return patrick;               //cleo、patrick作用域的结束

}

 

例2:

int road(void)
{
 int a=1;

 printf("a1=%d/n", a);

 {

      int a=7;

      printf("a2=%d/n", a);

 }
 while (a++ < 3)         //循环判断语句使用并递增起始的a,又进入循环代码,再次创建新的a。
 {

         int a=5;             //新a作用域的开始 。新的a,覆盖第一个a,每次循环结束以后,新的a就消失了。

         printf("%d/n", a++);   //新a作用域的结束。 

 }
  printf("a3=%d/n", a);    //为第一个a变化后的值
}   //打印结果为a1=1 a2=7 5 5 a3=4

 

注意,例2和如下代码的区别:

int road(void)

{

   int a=1;           //在while循环中,并没有新的a被定义,所以以下出现的a,都是此处的定义

   while (a < 3)

   {

       printf("%d/n", a++); 

   }

   printf("a=%d/n", a);

}  //打印结果1 2 a=3

 

 

 

函数原型作用域从变量定义处一直到原型声明的末尾。

 

 

一个在所有函数之外定义的变量具有文件作用域。具有文件作用域的变量从它定义处到包含该定义的文件结尾处都是可见的。

例:

int units=0;  //具有文件作用域的变量,也称为全局变量

int main(void)

{

   ...

}

 

 

my建议:尽量把变量的定义都放在函数体的开头