在学习《C专家编程》时,遇到了这段代码非常的有意思。
void generate_initializer(char * string)
{
static char separator = ' ';
printf(" %c %s \n",separator,string);
separator = ',';
}
在第一次执行时,函数首先打印一个空格,然后打印一个初始化字符串。所有后续的初始化字符串(如果还有后续的运行的话)的前面将加上一个逗号。
我们完善下程序,编译运行
#include<stdio.h>
void generate_initializer(char * string)
{
static char separator = ' ';
printf(" %c %s \n",separator,string);
separator = ',';
}
int main(void)
{
int i = 0;
char *string = "abcdefgh";
for(i = 0;i < 10;i++)
{
generate_initializer(string);
}
return 0;
}
运行结果如下:
为什么会这样呢,因为我们在函数内定义了局部静态变量,为静态局部变量赋初值是在编译时进行的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。