全局变量与局部变量重名

 

  1. 函数内部定义的局部变量与全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量。也就是只有局部变量会起效果。在此定义域中赋值等操作时都不会使用到全局变量。
  2. 在main函数或其他函数里定义了局部变量,同时同名的全局变量同时也存在,当调用一个使用了该变量的函数(该变量在此函数中无定义)时,函数会使用全局变量。而不是main或其他函数中定义的同名变量。例如
    1. #include <stdio.h>
      #include <stdlib.h>
      
      int n=5;
      void fun(int m)
      {
          int n=1;
          if(m<10)
          {
              fun(m+1);
              printf("%d ",n++);
          }
      
      }
      void print() { printf("%d\n",n); }

      /*void printm()
      {
        printf("%d\n",m)
      }*/
      int main() { int n; scanf("%d",&n); printf("%d\n",n); print(); fun(n);
       // int m=10;
      // printm(); return 0; }

      输入3时, 运行结果为: 3  5 ,1 1 1 1 1 1 1 。(以上注释掉的部分为测试使用)

  3. 当第一次输出的时候,只是调用输出了在main()函数里边定义的n,所以当输入3时,只有main里边定义的n被改变成为3,然后下一句输出n就直接输出的是上边刚刚赋值了的3。
  4. 调用print函数时输出的结果为5,虽然print函数里只有一句printf(),看似与上边的输出语句并无其他区别,但此时print函数只能得到全局变量n,虽然在main函数里有对print()函数的调用,但是print()函数与main函数还是属于两个作用域,main中定义的局部变量n并不能影响print()函数中对n的使用,所以print函数使用的还是全局变量n。
  5. 在递归函数fun()中,每次都对声明局部变量n=1,然后每次函数发生递归的时候printf()函数中都会对n进行++操作,然而输出的全是1,这是由于当函数发生递归的时候调用自己,但是每次调用printf()函数时候,都使用的是自己的局部变量n=1,并不会受上一层n的影响也不会影响到上一层的n,更不会受全局变量n=5的影响。
  6. 我们假设当无全局变量,只有函数自己定义的局部变量的时候,函数调用printm()函数输出m,看能不能输出main中定义的m的值,结果连编译都过不了,因为对于printm()函数来说,这个m到底是个啥东西啊,查找周围并没有对m的定义,(然而并不查找到人家main函数里边去)。所以对于函数来说首先是自己定义的局部变量,其次是大家共有的全局变量。即使是递归,各自层的变量之间也不会相互影响。

     

posted @ 2016-03-10 19:44  Freedom314  阅读(8719)  评论(0编辑  收藏  举报