6、类型修饰符

类型修饰符

1. auto

用法auto 是局部变量的默认存储类别,通常可以省略不写。它表示变量在声明所在的块(如函数或代码块)内有效,当块结束时变量被销毁。

#include <stdio.h>

int main() {
    {
        auto int a = 10; // auto 可省略不写,局部变量
        printf("a = %d\n", a); // 输出 a 的值
    } // 变量 a 的作用域结束,此处 a 被销毁

    // printf("a = %d\n", a); // 错误:变量 a 不在此作用域内

    return 0;
}

// 输出结果:
// a = 10

2. register

用法register 提示编译器将变量存储在 CPU 寄存器中,以提高访问速度。register 变量不能取地址。

#include <stdio.h>

int main() {
    {
        register int a = 10; // 提示编译器将 a 存储在寄存器中
        printf("a = %d\n", a); // 输出 a 的值
        // int* p = &a; // 错误:不能获取 register 变量的地址
    }

    return 0;
}

// 输出结果:
// a = 10

3. static

用法static 用于定义静态局部变量和静态全局变量。

  • 静态局部变量在函数调用结束后仍保留其值,不会被销毁。
  • 静态全局变量仅在定义它的文件内有效,其他文件不能访问。
#include <stdio.h>

// 静态全局变量,仅在当前文件内有效
static int global_var = 20;

int main() {
    {
        static int a = 0; // 静态局部变量
        a++;
        printf("a = %d\n", a); // 每次运行时,a 的值会递增
    }

    {
        static int a = 0; // 静态局部变量,即使在不同块中定义,仍然保留其值
        a++;
        printf("a = %d\n", a); // 每次运行时,a 的值会递增
    }

    printf("global_var = %d\n", global_var);

    return 0;
}

// 输出结果:
// a = 1
// a = 2
// global_var = 20

4. const

用法const 用于定义只读变量,表示该变量的值不能被修改。

#include <stdio.h>

int main() {
    const int a = 10; // 只读变量
    // a = 20; // 错误:不能改变 const 变量的值
    printf("a = %d\n", a); // 输出 a 的值

    return 0;
}

// 输出结果:
// a = 10

5. extern

用法extern 用于声明变量或函数是在其他文件中定义的,使其可以在当前文件中使用。

  • 在一个文件中定义变量或函数。
  • 在另一个文件中用 extern 声明该变量或函数。

file1.c

#include <stdio.h>

int a = 10; // 定义全局变量

void func() {
    printf("a = %d\n", a); // 输出全局变量 a 的值
}

file2.c

#include <stdio.h>

extern int a; // 声明外部变量
extern void func(); // 声明外部函数

int main() {
    func(); // 调用外部函数
    printf("a = %d\n", a); // 输出外部变量 a 的值

    return 0;
}

// 输出结果:
// a = 10
// a = 10

6. volatile

用法volatile 告诉编译器不要对变量进行优化,表示变量的值可能会在程序执行过程中被其他进程或硬件改变。这对多线程编程和嵌入式系统编程非常重要。

#include <stdio.h>

volatile int flag = 1; // 定义易变变量,提示编译器不要优化

int main() {
    while (flag) {
        // 等待外部改变 flag 的值
    }
    printf("flag 被外部修改为 0,退出循环\n");

    return 0;
}

// 假设在程序运行时,另一个进程或硬件将 flag 修改为 0,则输出:
// flag 被外部修改为 0,退出循环

总结

  • auto:默认局部变量存储类别,可以省略。
  • register:提示编译器将变量存储在寄存器中,提高访问速度。
  • static:定义静态局部变量和静态全局变量,控制变量的生命周期和作用域。
  • const:定义只读变量,不允许修改其值。
  • extern:声明在其他文件中定义的变量或函数,实现跨文件访问。
  • volatile:告知编译器变量的值可能会被外部改变,防止编译器优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值