C语言的一些关键字(C语言复习一)

没办法,考研复试要考笔试C语言,这里只能简单复习下了,这篇主要是说下关键字auto static extern register的用法

static

static主要有如下三个用法

  • 在函数内部修饰一个变量
  • 在.c文件中限制函数的作用域
  • 在数组参数中限制数组的最小长度

函数内部修饰变量

1
2
3
4
5
6
7
8
9
10
11
12
13
void f() {
static int i = 0;
int j = 0;
i++;
j++;
printf("i = %d j = %d\n", i,j);
}

int main(){
for(int i=0;i<10;i++){
f();
}
}

在上述代码执行后,i的输出从1依次递增到10,而j永远都是1

这个用法在c++中也能用,可以用来维护一些全局变量

.c文件中限制作用域

1
2
3
4
5
6
7
8
9
//a.h
void func1();

///a.c
static void helperFunction(){
}
void func(){
helperFunction();
}

这个helperFunction在其它文件中是不可用的,只有在a.c中才能使用

这个用法在C++中也能用,把函数可见性限制在编译单元内,但是C++更推荐直接使用namespace{}

在数组参数中限制最小长度

1
2
3
4
5
void printVec3(int arr[static 3]) {
for (int i = 0; i < 3; i++) {
printf("%d\n", i);
}
}

上述参数中限制了arr的长度必须大于等于3

auto

现在C语言中的auto没啥屌用

register

1
2
3
It's a hint to the compiler that the variable will be heavily used and that you recommend it be kept in a processor register if possible.

Most modern compilers do that automatically, and are better at picking them than us humans.

register是一个编译提示,提示这个变量很常用,让编译器把这个变量丢CPU的寄存器上以提高读写速度,这个优化在现代编译器中是自动完成的,因此也不用管

extern

这个关键字是用来声明全局变量的,也就是访问跨编译单元的变量

1
2
3
4
5
6
7
8
9
10
//a.h
extern int a; //声明

//a.c
int a = 1; //定义

//main.c
int main(){
printf("%d",a);
}

如上图,在.h中用extern声明,在.c中定义,然后包含对应的.h文件就能直接访问了