zoukankan      html  css  js  c++  java
  • 关于——代码块内的静态存储类(空链接的静态存储类)

    学习C语言的五种存储类时,发现代码块作用域的静态变量(空链接的静态存储类)比较难理解,或者说是比较绕圈圈,反正有点懵逼的感觉。参考了“仓”的一篇文章(http://www.cnblogs.com/dongzhiquan/archive/2009/07/21/1994792.html),自己对其中一个小程序进行调试后,理解要深刻一些,根据参考文献说说自己的一些收获和理解。

    1. 一个代码块(或者函数)中Static类内部变量 与 auto自动变量(即未加 Static 声明的局部变量)一样,只能在定义该变量的代码块(或函数)内使用该变量,二者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在(但别的代码块或者函数还是不能使用它)。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
    2. 函数体内如果在定义静态变量的同时进行了初始化,则之后函数再次被调用时不再对该变量进行初始化操作(出现在函数内部的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。(代码块作用域的静态变量只有在第一次被调用时会进行初始化,之后的初始化是跳过不进行的,但是除了初始化外的赋值和运算等操作还是会执行的)
    3. 静态局部变量的初始化表达式必须是一个常量或者常量表达式,如果没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。
    4. 当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

    下面举参考文献中的例子进行验证:求5的阶乘

    #include <stdio.h> 
    
    long factor(int n) 
    { 
        static long int f = 1; //static变量 f 
        f *= n;          //每次执行后都保留着(“记住了”) f 的值,下一次运算和赋值时接着用
        return f; 
    } 
    
    main( ) 
    { 
        int i; 
        for ( i = 1; i <= 5; i++ ) 
            printf ( "%ld
    " , factor( i) ) ; 
    }

    结果如下:

    调试时发现一个现象,对static long int f = 1; 设置断点后,点击调试,发现断点自动消失了

       

    这应该也验证了:初始化代码块静态变量语句“static long int f = 1;” 是特殊的,不是每次运行代码块时都会执行的,仅仅在第一次初始化时有效。

    把代码块静态变量换成自动变量的话,即“long int f = 1;”,则每次调用factor函数时 f 的值都重新初始化为1,所以结果也就是1*1,1*2,1*3,1*4,1*5。结果如下图

     

    这个程序只是验证了结论1和结论2(也可以带上结论4),也是我主要觉得蒙圈的地方。

  • 相关阅读:
    Android编译相关资料的网址
    npm项目编译
    JAVA项目编译
    docker 常用命令[转载]
    jenkins安装的时候 提示字体问题的解决方法
    deployment
    kube-proxy运行机制分析【转载】
    kubelet tls
    js执行上下文和执行栈
    js事件循环(event loop)
  • 原文地址:https://www.cnblogs.com/TomLily/p/5987992.html
Copyright © 2011-2022 走看看