理解和如何使用关键字auto、static、extern、register

理解和如何使用关键字auto、static、extern、register_第1张图片

文章目录

  • 前言
  • 一、auto---自动变量
  • 二、static
    • 1.static修饰局部变量
    • 2.static修饰全局变量
    • 3.static修饰函数
  • 二、extern
  • 三、register---寄存器变量
  • 总结


前言

   这篇文章主要介绍C语言中的4个关键字


一、auto---自动变量

     函数中定义的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中,在调用函数时,系统会给这些变量分配存储空间,在函数调用结束时就会自动释放这些存储空间。这类局部变量称为自动变量。自动变量使用关键字auto作存储类别的声明。例:

int test()
{
    auto int a=3; //定义a为自动变量
      

}

  其中,a是自动变量,对a赋值为3,执行完test后,自动释放 a所占的存储单元。

实际上,关键字auto可以省略,不写auto则隐含指定为“自动存储类别”,属于动态存储方式。

如:在函数体中 

int a = 2;

auto int a = 2;

等价

  程序中大多数变量属于自动变量,在函数中定义的变量都没有声明为 auto,其实都隐含指定为自动变量

二、static

     1.static修饰局部变量

      当函数中的局部变量被关键字static修饰时,其局部变量的值在函数调用结束后不消失而继续保留原值,即占用存储单元不会释放,在下次调用该函数时,该变量已有值(就是上次函数调用结束时的值)

代码如下(示例):

void test1()
{
    int a=1;
    a++;
    printf("%d\n",a);      

}


void test2 ()
{
   static int a=1; //静态变量
    a++;
    printf("%d\n",a);

}


int main()
{
    for(int i=0;i<3;i++)
    {
        test1();
        test2();

    }
   return 0;
}

理解和如何使用关键字auto、static、extern、register_第2张图片

 上面的执行结果是调用test1的,当调用test1时a变量会被创建,调用完出test1时变量a就被释放了,就不会保存之前调用的值,也即每次调用时a都会重新创建一次。

理解和如何使用关键字auto、static、extern、register_第3张图片

这是调用test2结果,当每次调用时 a的值都会保留前一次调用的结果,即此时的a在第一次编译时就创建了

总之, static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束

2.static修饰全局变量

       在一个程序的多个文件中,如果一个文件中的全局变量用static修饰就会改变全局变量的链接属性,即不再具有外部链接属性,此时该文件的全局变量就只能在本文件内部使用,那么其他文件就不能引用该文件的全局变量了。    

代码如下(示例):

代码2中,case.c文件中的变量b由static修饰,故test.c文件就无法引用b变量了。


 3.static修饰函数

       理解和如何使用关键字auto、static、extern、register_第4张图片

 代码2中的函数由static修饰,编译会有连接错误

  二、extern

      如果一个程序包含两个文件,在两个文件中都要用同一个外部变量,不能分别在两个文件中各自定义一个外部变量,否则在进行程序连接时会出现“重复定义”的错误。正确的做法是:在一个文件中定义外部变量而在另一个文件中用extern对外部变量作“外部变量声明”。在编译和链接时,系统就会知道有“外部链接”,就可以从别处找到已定义的外部变量,并将在另一个文件中定义的外部变量的作用域扩展收到本文件,在本文件中可以合法的引用外部变量了。

代码示例:

理解和如何使用关键字auto、static、extern、register_第5张图片

三、register---寄存器变量

      一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪个变量的值时,有控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存中存放。

理解和如何使用关键字auto、static、extern、register_第6张图片

 如果一些变量使用频繁,为提高执行效率,允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器中取出参加运算,不必再到内存中去取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样可以提高执行效率。当定义变量时就可用关键字register作声明。如:

register  int  a;         //定义a为寄存器变量

注意:1. 三种局部变量的存储位置是不同的:自动变量存储在动态存储区;静态局部变量存储在                   静态存储区;寄存器存储在CPU中的寄存器中。

            2. 用auto、register、和static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。但用extern声明外部变量时,则类型名可以省略,只须写外部变量名即可。


总结

          以上就是今天要讲的内容,本文对5个关键字进行了讲解,或许讲的不那么好,但是希望对大家也能有所帮助吧!

你可能感兴趣的:(c语言,c++)