zoukankan      html  css  js  c++  java
  • static类型的变量

    c语言中变量的储存类型有以下四种

    auto  如果没有定义储存类型  默认就是这个类型  比如  int a = 10;  储存类型就是 auto;编译器会跟你定义的位置,以及用途,自动帮你决定使用那种储存类别;

    如果你定义在函数内 ,那么编译器就把他当做局部变量,如果定义在函数外部,编译器把他归为全局变量,如果这个变量用作 循环因子(for循环中 i );编译器就把他

    定义为寄存器变量;

    register  寄存器变量,用作循环因子等使用频率极高的变量

    extren  全局变量  *从定义的位置开始* 在整个程序执行期间有效,如果这个程序是多文件的,那么在其他文件中也可以使用这个变量;

    无论是局部变量还是全局变量,一般都不显示的指明,有编译器来自动区分就好了;

    【局部变量 和全局变量的区别】:

    全局变量:(生命周期)在程序执行期间有效,(作用域)从定义起本文件和其他文件都可以引用

    局部变量:(生命周期)函数执行完就从内存中销毁,(作用域)在函数内有效

    static  静态变量 ,可以修饰局部变量和全局变量  ; 上面通过作用域和生命周期对比了局部变量和全局变量,那么加上static关键字修饰后有什么变化呢?

    [static 全局变量]:(生命周期)在程序执行期间有效,(作用域)作用域缩小了,只有本文件可以引用,其他文件不能引用了

    [static 局部变量]:(生命周期)生命周期变了,在整个程序期间有效,(作用域)还是在函数内有效

    看个例子:

    #include <stdio.h>
    
    void test() {
    
        static int t = 3;
        printf("%d
    ",t++); 
    }
    
    int main(void) {
        
        test();   // 3
        test();   // 4
        test();   // 5
    }

    如果  去掉static修饰 那么test函数每次打印的都是 3;

    值得注意的是,虽然加了static修饰后,t的生命周期变长了(不会因为test执行完就销毁),但是t的作用域还是没有变的,尝试在 main函数里面打印t的值报错;

    这个例子其实可以用全局变量t来实现,效果是一样的,那么为什么还需要static关键字呢?

    有两个 因素:

    (1) 全局变量存放在内存中,而局部变量存放在寄存器中,运行速度相差很大; (这一点不是主要的因素)

    (1) 全局变量如果没有加 static的话,在多文件程序里面  多个文件可以读取到这个变量,容易造成变量重名,但是有些时候 有的变量需要在整个文件中都有效又必须要全局变量才能行,

    那么加上static关键字就可以两者兼得了,既定义了全局变量,在多文件程序中又不用担心变量重复,适合封装单独的功能模块;

  • 相关阅读:
    java后台对上传的图片进行压缩
    Reflections框架,类扫描工具
    commons-httpclient和org.apache.httpcomponents的区别
    sql里面插入语句insert后面的values关键字可省略
    Callable接口、Runable接口、Future接口
    Java多线程之Callable接口的实现
    说说Runnable与Callable
    论坛贴吧问题:如何终止运行时间超时的线程
    使用Future停止超时任务
    spring的@Transactional注解详细用法
  • 原文地址:https://www.cnblogs.com/codeAB/p/6524979.html
Copyright © 2011-2022 走看看