存储类型关键字
auto
auto 是默认的存储类别关键字,它用于定义自动变量。
- 自动变量的生命周期仅限于定义它们的代码块,当代码块执行结束时,它们会被销毁。
示例代码(记作代码1):
1 2 3 4 5 6 7 8
| #include <stdio.h>int main() { auto int x = 10; // 可以省略 "auto",因为它是默认的存储类别 printf("x: %d\n", x); // x 的生命周期仅限于 main 函数 return 0; }
|
在上方代码1中,auto int x = 10;和int x = 10;是等效的:
这是因为 int x = 10; 默认就是一个自动变量,编译器会根据上下文自动识别它为自动变量。
同样,例如下方代码(记作代码2):
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>int main() { auto int x = 10; // 可以省略 "auto",因为它是默认的存储类别 printf("x: %d\n", x); auto y = x; // 使用auto类型定义变量y printf("y: %d\n", y); return 0; }
|
当你写 auto y = x; 时,编译器也会将 y 类型设置为 int,因为 x 是 int 类型,所以 y 也被赋予了相同的类型。
C语言的类型系统会根据右侧表达式的类型来确定左侧变量的类型,这就是类型推断。
因此,在代码2中,y 被推断为 int 类型,与 x 相同。
extern
extern 用于声明一个全局变量,它表明该变量在当前文件中并没有被定义,而是在其他文件中定义的。
- 这允许多个文件共享同一个全局变量,该变量可以被多个文件调用,并修改其值。
示例代码(extern使用时,对应着多文件场景):
文件1.c:
1
| int globalVar; // 定义全局变量
|
文件2.c:
1 2 3 4 5 6
| #include <stdio.h> extern int globalVar; // 声明全局变量,以便在其他文件中使用 int main() { printf("globalVar: %d\n", globalVar); return 0; }
|
register
register 用于请求编译器将变量存储在CPU寄存器中,以加快对变量的访问速度。
- 这是一个建议(编译阶段请求将register存储在CPU寄存器中),编译器可能会忽略它,特别是在如今的编译器中(因为如今的编译器已经非常智能,它们能够更好地管理寄存器分配,从而提高代码的性能,通常来说,如今的编译器比程序员更了解如何优化代码)。
示例代码:
1 2 3 4 5 6 7
| #include <stdio.h>int main() { register int i = 5; // 请求将变量 i 存储在寄存器中 printf("i: %d\n", i); return 0; }
|
static
static 用于改变变量的存储期和可见性。
- 在函数内部使用
static 声明的变量具有持久的存储期,而在如今的使用 static 声明的变量只在当前文件中可见。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>void demo() { static int count = 0; // 持久性的局部变量 count++; printf("count: %d\n", count); } int main() { demo(); // 输出 count: 1 demo(); // 输出 count: 2 return 0; }
|
如果上述代码不加static:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>void demo() { int count = 0; // 持久性的局部变量 count++; printf("count: %d\n", count); } int main() { demo(); // 输出 count: 1 demo(); // 输出 count: 1 return 0; }
|