zoukankan      html  css  js  c++  java
  • C/C++(变量作用域)

    变量的作用域

    凡是在{}以内的变量为局部变量,也包括形式参数。

    凡是{}外的变量为全局变量

    作用域:

    {}以内的作用域为局部作用域,主要包含的事变量

    {}以外的作用域为全局作用域,包含的是变量和函数

    同一作用域内,不可以用重命名的变量
    局部变量的作用域,起始于定义处,直到所在的大括号处结束。
    全局变量的作用域,起始与定义处,知道本文件结束。

    作用域叠加:

    全局变量同局部变量的作用域叠加,在不同的作用域中,可以有重名的标识符,局部变量会覆盖全局变量的作用域。

    #include<stdio.h>
    int a = 100;
    int main() {
        int a = 10;
        printf("a = %d
    ",a);//10
        return 0;
    }
    

    更小的作用域{}只能再次划分局部作用域

    #include<stdio.h>
    int a = 100;
    int main() {
        int a = 10;
        {//只能用于局部
            int a = 1;
            printf("a = %d
    ",a);//1
        }
        return 0;
    }
    

    全局变量命名污染

    函数是全据变量,要防止命名污染,全局变量的使用更要避免命名重名。尽量少用全局变量。

    局部变量的生命周期

    函数的生命周期起始与调用,结束与调用结束。函数体内的局部变量相同。
    main函数比较特殊它开始于程序的开始,结束语程序的结束

    全局变量的生命周期

    全局变量的生命周期起始与main函数的调用,结束于main函数的结束,等价于程序的生命周期。
    main函数中的变量生命周期与全局变量相同,但他们的作用域不同

    修饰符

    auto类型

    只能用于修饰局部变量,表示该变量存储在栈上stack
    特点:随用随开,用完消失
    默认的局部变量,就是auto类型,所以通常将其省略。C++中auto是自动变量。
    eg:

    auto int a = 23;
    

    register

    只能修饰局部变量,将内存中的变量升级到cpu寄存器中存储,这样访问速度会很快。存储cpu的变量,速度快但数量有限,通常用来优化。用于频繁使用的变量。一般不用。

    extern(通关文牒)

    修饰全局变量,
    c语言是订单文件编译,然后再将编译的.o文件同库仪器连接成可执行文件,所以跨文件需要声明。
    区分声明预定义:extern可以省略,不建议省略
    eg:

    int a;//声明
    int a = 120;//定义
    

    全局变量声明未定义时是0,局部变量是随机数。vs中是不行的。局部变量必须定义。

    static(隔离出境)

    static修饰局部变量,默认初始化0

    #include<stdio.h>
    void func();
    int main() {
        for(int i = 0;i < 10;i++) {
            func();
        }
        return 0;
    }
    void func() {
        int a = 1;//默认auto修饰,存储在栈中即用即消失,所以每次用完消失++操作无效。
        printf("a = %d	",a++);
        static int b = 1;//修饰的局部变量存放在data块中,生命周期等同与进程。 
        //无论以后调用多少次函数,它的初始化一次
        printf("b = %d
    ",b++);
        printf("++++++++++++++++++");
    }
    /*
    a = 1   b = 1
    ++++++++++++++++++
    a = 1   b = 2
    ++++++++++++++++++
    a = 1   b = 3
    ++++++++++++++++++
    a = 1   b = 4
    ++++++++++++++++++
    a = 1   b = 5
    ++++++++++++++++++
    a = 1   b = 6
    ++++++++++++++++++
    a = 1   b = 7
    ++++++++++++++++++
    a = 1   b = 8
    ++++++++++++++++++
    a = 1   b = 9
    ++++++++++++++++++
    a = 1   b = 10
    ++++++++++++++++++
    */
    

    static修饰的变量存储在data区域中,生命周期等同于进程,和函数的作用域无关

    #include<stdio.h>
    void print(int num,int age,char sex,float score);
    int main() {
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
        print(1001,32,'x',99);
    }
    void print(int num,int age,char sex,float score) {
        static int flag = 1;
        if(flag == 1) {
            printf("num	age	sex	score	count
    ");
            flag = 0;
        }
        static int count = 0;
        printf("%d	%d	%c	%.2f	%d
    ",num,age,sex,score,++count);
    }
    //控制执行次数,记录打印某函数的调用次数多用于避免多次加载的资源
    

    全局变量会带来命名污染,好处(全局可用,避免传参),用static解决。一个全局变量拥有外延性,可以被其他的文件所用,extern。static修饰全局变量以后,外延性消失,变成本文件内部的全局变量
    main.c

    static int a = 100;
    

    bb.c

    static int a = 200;
    

    这样两者文件中的a都限制在本文件中
    main.c

    extern a;
    printf("a = %d
    ",a);//报错,编译不通过
    

    bb.c

    static int a = 200;//限制了外延性,成了局部变量
    

    同样适用于函数
    全局变量被static修饰后,存放的位置没有变,改变的了作用域,外延性被限制。

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/intelwisd/p/8290534.html
Copyright © 2011-2022 走看看