7. auto 关键字

auto 关键字 用于显示的声明一个函数内或复合语句内的变量为自动存储期的变量。

这里有一个存储期的概念。

存储期是指一个变量在内存中的生命周期。在 C99 标准和之前标准有三种存储期:

  1. 静态存储期:是指全局变量或静态局部变量,它是从程序运行时开始,程序运行后销毁。
  2. 自动存储期:是指函数内非静态局部变量、复合语句内部声明的非静态变量,这些变量在进入作用域内创建,退出作用域后自动销毁。
  3. 动态存储期:由调用系统动态分配内存函数 malloc 等从操作系统中申请的内存。这的内存可以用 free 函数动态释放。

在 C11 的标准中又规定了线程存储期。

默认一个局部变量如果没有声明为静态变量,则该变量默认就是自动存储期的变量,即自带 auto 属性。

语法

auto 数据类型 变量名1, 变量名2

说明:

  1. 不能使用 auto 关键字修饰全局变量。
  2. 局部变量如果使用 static 声明为静态局部变量,则不能再使用 auto 修饰为自动变量。

示例:

// filename: auto.c
#include <stdio.h>

// 求 n 的阶乘 n!
int factorial(int n) {
    auto int result = 1;  // 显式声明自动变量
    if (n < 1)
        return 0;
    while(n > 1) {
        result *= n;
        n--;
    }
    return result;
}

int main(int argc, char * argv[]) {
    printf("3!: %d\n", factorial(3));
    printf("5!: %d\n", factorial(5));

    return 0;
}

编译和运行结果如下:

weimingze@mzstudio:~$ gcc -o register register.c
weimingze@mzstudio:~$ ./register
3!: 6
5!: 120

需要注意的是,在 C++ 的 C++11 标准中, auto 关键字的含义已经重新定义, auto 不再是 自动变量的修饰符。而是自动类型推断的关键字。

实验:

  1. 将全局变量声明为自动类型变量,然后编译时查看编译器的信息提示,然后看提示是什么意思?
  2. 将局部变量同时使用 staticauto 修饰,然后编译时查看编译器的错误提示信息,然后看提示是什么意思?