• 全局变量与局部变量重名


    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函数里边去)。所以对于函数来说首先是自己定义的局部变量,其次是大家共有的全局变量。即使是递归,各自层的变量之间也不会相互影响。
  • 相关阅读:
    shell脚本修改Linux系统中所有IP样例
    关闭并卸载数据库脚本
    查询编译不通过的存储过程并重新编译
    SQL函数造数据样例(一)
    类型转换和多态
    Java学习笔记(三)
    Java学习笔记二()
    Java学习笔记(一)
    1.2.零宽断言
    1.3.匹配小括号的字符(可能有小括号在一行的,也有多行的)
  • 原文地址:https://www.cnblogs.com/freedom314/p/5263183.html
Copyright © 2020-2023  润新知