zoukankan      html  css  js  c++  java
  • C语言基础(17)-作用域

    一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域。

     

    不推荐写法

    int a; // 出现了语法的二义性,可能是声明也可能是定义,所以最好定义完成之后声明

    void func(); // 出现了语法的二义性,可能有参数,也可能没参数

    推荐写法(严谨写法)

    int a = 0; // 明确的定义了一个变量

    extern int a; // 明确的声明了一个变量,使用extern关键字明确声明一个变量

    void func(void); // 明确的声明了一个函数没有任何参数

    1.auto自动变量

    一般情况下代码块内部定义的变量都是自动变量。当然也可以显式的使用auto关键字,代码块之内的变量都可以称作auto变量代码块之外的变量叫全局变量。所有auto变量的生命周期就是变量所在的大括号。

    auto int a;

    2.register寄存器变量

    通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高。

    register int i;

    3.代码块作用域内的静态变量

     静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问

    static int i = 0; // 定义一个静态变量

    静态变量在程序刚加载到内存的时候就出现,所以和定义静态变量的大括号无关,所以一直到程序结束的时候才从内存消失,同时静态变量的值只初始化一次。

    4.代码块作用域外的静态变量

    代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问,在其它文件中不能被访问,即使是使用extern声明了也不行

    因为全局变量的名字是不能相同的,这样会带来一个什么问题呢?因为一个项目往往是多人写的,每个人都定义自己的全局变量,最后代码合并后会出错。但static的全局变量在不同的文件中名字是可以相同的。

    5.全局变量

    全局变量的存储方式和静态变量相同,但可以被多个文件访问,定义在代码块之外的变量,就是全局变量。

    6.外部变量与extern关键字

    extern int i; // 声明一个变量,这个变量已经在别的文件中定义了,这里只是使用,而不是定义

     

    7.全局函数与静态函数

    C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态。一旦一个函数定义为static,就意味着这个函数只能在定义这个函数的文件中使用,即使在其它文件中声明这个函数都没有用。

    对于不同文件中的static函数名字可以相同。

    示例1:auto变量使用Demo

     

    #include <stdio.h> // 这个头文件在系统目录下
    #include <stdlib.h> // 使用了system函数
    #include <Windows.h>
    
    // auto 变量使用Demo
    void autoVariableUseDemo(void);
    
    int main() {
    
    
    
        for (int i = 0; i < 10; i++) {
            autoVariableUseDemo();
            //staticVariableUseDemo();
        }
    
        //printf("z=%d
    ",z);
    
        system("pause");
        return 0;
    
    }
    
    
    void autoVariableUseDemo(void) {
    
    
        auto int n = 0;
        n++;
        printf("n=%d
    ",n);
    
    }

     输出结果

     示例2:static 变量使用Demo

    #include <stdio.h> // 这个头文件在系统目录下
    #include <stdlib.h> // 使用了system函数
    #include <Windows.h>
    
    // static变量使用Demo
    void staticVariableUseDemo(void);
    
    int main() {
    
    
    
        for (int i = 0; i < 10; i++) {
            //autoVariableUseDemo();
            staticVariableUseDemo();
        }
    
        //printf("z=%d
    ",z);
    
        system("pause");
        return 0;
    
    }
    
    void staticVariableUseDemo(void) {
    
        static int n = 0;
        n++;
        printf("n=%d
    ",n);
    }

     输出结果

     

     

  • 相关阅读:
    结对编程1-基于GUI的四则运算生成器
    个人作业1——四则运算题目生成程序(基于控制台)
    软件工程的实践项目课程的自我目标
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
    个人作业(2)---英语学习APP案例分析
    结对作业1----基于GUI的四则运算生成器
    个人作业1——四则运算题目生成程序(基于控制台)
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6483933.html
Copyright © 2011-2022 走看看