鱼C论坛

 找回密码
 立即注册
查看: 47|回复: 1

[学习笔记] 每日一学14

[复制链接]
发表于 2024-12-10 20:12:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 6bingame 于 2024-12-10 20:31 编辑

变量的存储类别

自动类型(auto)
用自动类型关键字 auto 说明的变量称为自动变量。其一般形式为:

auto 类型 变量名;

自动变量属于动态局部变量,该变量存储在动态存储区。定义时可以加auto说明符,也可以省略。


寄存器类型(register)
寄存器类型变量的存储单元被分配在寄存器当中,关键字register说明。其一般形式为:

register 类型 变量名;

寄存器变量时动态局部变量,存放在CPU的寄存器或动态存储区中,这样可以提高存取的速度,因为寄存器的存取速度比内存快得多。该类变量的作用域、生存期与自动变量相同。如果没有存放在通用寄存器中,便按自动变量处理。
但是由于计算机中寄存器的个数有限的,寄存器的位数也是有限的,所以使用register说明变量时要注意以下几点。
(1)寄存器类型的变量不宜过多,一般可将频繁使用的变量放在寄存器中(如循环中涉及的内部变量),以提高程序的执行速度。
(2)变量的长度应该与通用寄存器的长度相当,一般为int型或char型。
(3)寄存器变量的定义通常是不必要的,现在优化的编译系统能够识别频繁使用的变量,并能够在不需要编程人员作出寄存器存储类型定义的情况下,就把这些变量放在寄存器当中。


寄存器变量示例
#include<stdio.h>

int main()
{
    int=5,y=10,k;       //自动变量x,y,k

    for(k=1;k<=2;k++)
    {
        register int m=0,n=0;   //寄存器变量m,n

        m=m+1;

        n=n+x+y;

        printf("m=%d\tn=%d\n",m,n);
    }

    return 0;
}

例题分析:本范例中定义了两类变量,一类是自动变量x、y和k,还有两个寄存器变量m和n。


静态类型(static)
静态类型的变量占用静态存储区,用static关键字来说明。其一般形式为:

static 类型 变量名;

静态类型又分为静态局部变量和静态全局变量。C语言规定静态局部变量有默认值,int 型等于0,float 型等于0.0,char 型为 '\0', 静态全局变量也如此。而自动变量和寄存器变量没有默认值,值为随机数。

静态局部变量

定义在函数内的静态变量称为静态局部变量。关于静态局部变量的几点说明如下。
(1)静态局部变量是存储在静态存储区的,所以在整个程序开始时就被分配固定的存储单元,整个程序运行期间不再被重新分配,故其生存期是整个程序的运行期间。
(2)静态局部变量本身也是局部变量,具有局部变量的性质,即其作用域是局限在定义它的本函数体内的。
如果离开了定义它的函数,该变量就不再起作用,但其值仍然存在,因为存储空间并未释放。
(3)静态局部变量赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。
因此不管调用多少次该静态局部变量的函数,它仍保留上一次调用函数时的值。


静态局部变量示例:打印1~5的阶乘
#include<stdio.h>

long fac(int n)
{
    static long f=1;  //定义静态局部变量f,仅初始化一次,在静态存储区分配空间

    f=f*n;

    return f;
}

int main()
{
    int k;

    for(k=1;k<=5;k++)
    {
        printf("%d!=%ld\n",k,fac(k));
    }
    printf("\n");

    return 0;
}


例题分析:程序从main()函数开始运行,此时fac()函数内的静态局部变量f已在静态存储区初始化为1。
当第一次调用fac()函数时,f=1*1=1,第一次调用结束并不会释放f,仍保留1。
第二次调用fac()函数时,f=1*2=2(其中1仍是上次保留的结果),第二次调用结束f的值仍保留为2。
第三次调用,f=2*3=6,f内这次保留的是6。
第四次调用......第五次调用的结果为120(24*5)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-10 21:24:23 | 显示全部楼层
不错,继续加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 15:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表