C语言关键字之static【经验分享】
C语言中static的关键字,有诸多特性,有编程经历的朋友应该深有感触。以局部静态变量来说,它有三个特点:生存周期:与程序之生命相始终;
作用范围:仅在局部(这一点,同普通变量无区别。
赋值:仅在编译阶段赋且仅赋初值一次,注意是初值,不是说赋值。
static的第三个特点最重要,也最容易让人忽略。下面举例子来说。请看下面简单的代码。
代码1:
#include "stdio.h"
long fac(int n)
{
static long f=1;
f=f*n;
return f;
}
void main(void)
{
int i;
for(i=1;i<=5;i++)
{
printf("%d!=%d\n",i,fac(i));
}
}
请问输出结果是什么呢?没错,是1到5,每一个数的阶乘。
仔细的读一下代码,你会不会有这样的疑问红色标注的语句static long f=1;不是被调用了五次吗?这也f的值在每次调用的时候都被赋值1啊,比如fac(4),f应该等于f*4=1*4=4啊,怎么会是四的阶乘呢?仔细品味下static的第三个特点,仅在编译阶段赋且仅赋初值一次。你是不是明白了呢。
代码2:
#include "stdio.h"
long fac(int n)
{
static long f;
f=1;
f=f*n;
return f;
}
void main(void)
{
int i;
for(i=1;i<=5;i++)
{
printf("%d!=%d\n",i,fac(i));
}
}
代码2,将代码1中的红色语句形式上拆分成了两部分。结果是否一样呢?结果,差着十万八千里呢!为什么呢?还是一个赋初值的问题。static long f;其实,该语句就是赋初值语句,不过是默认值0罢了。下面那句f=1;根本就不是赋初值了,它在每一次函数的调用时都会执行一次。就是这么一个小小的区别,导致代码1和代码2结果大相径庭