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修饰后,存放的位置没有变,改变的了作用域,外延性被限制。

  • 相关阅读:
    常见的HTTP状态码(HTTP Status Code)说明
    Java基本数据类型和Integer缓存机制
    面向对象的三大基本特征和五大基本原则
    工程变更(ENGINEERING CHANGE)
    反射
    Redis学习手册(开篇)
    MVC,SSM与三层架构的构成及相互关系
    Java框架篇---Mybatis 入门
    java三大框架介绍
    WEB前端JS与UI框架
  • 原文地址:https://www.cnblogs.com/intelwisd/p/8290534.html
Copyright © 2011-2022 走看看