c语言变量作用域问题

 

c语言中的变量作用域总结


不管什么语言,main好像总是程序的入口,大括号是它的内容;变量的作用域总是困扰着我们,接下来,我们循序渐进的搞明白c语言中的变量作用域,首先得知道c是弱类型的语言,弱类型表现在很多方面:
1:你可以直接在程序中写一个常量,然后一个分号:1;
2:在定义函数时,void型的函数可以return;int型的可以不用写返回值。
………还有很多
 
下面我们一步一步开始:首先在main中定义的变量当然作用于整个main函数了
 
1:在main中定义变量
1 #include<stdio.h>
2 int main()
3 {
4  
5   int a=0;
6   printf(“%d\n”,a);
7   return 0;
8 }

 

2:当在一个结构体中,即大括号中定义时(后边的#include<stdio.h>都省略了):
int main()
{
 
    int a=0;
 
    //结构体中
    {
    //首先结构体中是可以访问外层的变量的,这里可以直接访问a;
        //printf(“%d\n”,a);
    //其实上边在访问a的时候,编译器是会先在当前结构体中找a,如果没有才找外层的a
        int a = 1;//当然这里这个a只属于当前结构体中,即在大括号结束时,a被销毁,并不会影响外边的a;
        printf(“%d\n”,a);//输出1
    }
 
    printf(“%d\n”,a);//输出还是0
    return 0;
}

 

 
3:结构体可以多层嵌套的,多层嵌套时的情况:
int main()
{
  int a = 0;
  //第一层结构体
  {
    printf(“%d\n”,a);//输出0
    int a = 1,b=10;
    printf(“%d\n”,a);//输出1
    //第二层嵌套
    {
      printf(“%d\n”,a);//输出1
      int a = 2;
      printf(“%d\n”,a);//输出2
    }
  }
  printf(“%d\n”,a);//输出0
  //printf(“%d\n”,b);//这个是不能访问的,b在内层结构体中
}
总结:当有多层结构体嵌套时,最内层的可以访问外层的,但是外层的不可以访问内层的
 
4:通过3的例子总结,似乎可以解释一切的变量作用域了,但是随着知识的不断学习,又有了新的疑惑
1 int main()
2 {
3   //在for的循环体中定义变量,且循环体只有一条语句,建议任何时候都写大括号
4   for (int a=0; a<3; a++)
5           int b = 0;//报错,不能定义变量,要定义只能在大括号中
6 
7   return 0;
8 }
这个其实比较好理解,如果不加大括号,表面上看b属于main的全局,因为只有一对main函数的大括号,但是对于for循环来讲,又希望这个
b在循环结束就释放掉,这样就矛盾了,所以编译器强制在for循环体中定义变量时定义在大括号中;类似的还有case语句中定义变量,所
以在使用for或者case时,即使语句只有一条也加上大括号;
 
5:for循环中的其他情况,对比函数(方法)定义时的变量作用域
int main()
{
  for(int a=0; a<3; a++,b++)//这里的b当然是不能访问了,b是在下边的一对大括号中定义的,也就是内层结构体中
  {
    printf(“%d\n”,a);//依次输出0、1、2,前提上边小括号中的b++删掉
    int a = 10;//这个重名的a是可以的,在上边定义过a后,循环体重可以继续定义a,这个根据1、2中的结构体来理解
    int b = 0;
    printf(“%d\n”,a);//每次都输出10
  }
  return 0;
}
上边的例子来看for循环中的局部变量a可以在循环体中定义重名变量,只是每一次循环结束,循环体中的a会被释放
 
但是在定义函数时,形参是不能在函数体中定义重名变量的
int test(int num1, int num2)
{
  int num1 = 0;//这个是不允许的,按照上边的for循环来讲是可以的,但是函数的形参是等待接收实参的值的,并且这个值要在函数体中参与运算的,是一个很有意义的变量,c不允许重新定义与形参同名的变量名以防止这个形参真的没了意义,而for中的a只是让循环继续的一个条件,即使在循环体中重新定义了,每次循环结束后,会被释放,a又回到了原来的值,并不影响循环,所以可以;
  return 0;
}
以上都是个人的理解,自己也是正在学习c基础,如有不对的地方,欢迎一起讨论;
 
 
posted @ 2014-05-02 09:28  随遇不安  阅读(2254)  评论(0编辑  收藏  举报