静态变量在其作用域内,只有有一份,尽管是局部变量,但它不存在于栈上(实际上它存在于全局数据区域),因此每次得到的i的地址都是一样的。如果i是普通的自动变量,那么它就存在于栈上,随着每次递归而参与压栈和出栈,如果是这样的话,每次得到i的地址将是不同的。
例1
#include<stdio.h>
int fact( )
{ static int i=5;
if(i==0) return 1;
else
{ i--;
return((i+1)*fact( )); }
}
int main( )
{ printf("factor of 5!=%d\n",fact());
return 0;}
输出结果为120
例2
#include<stdio.h>
int fact( )
{ static int i=5;
if(i==0) return 1;
else
{ i--;
return(fact( )*(i+1)); }
}
int main( )
{ printf("factor of 5!=%d\n",fact());
return 0;}
输出结果为1
进行乘法运算时,例1的i+1已经运算并保存,而例2的i+1一直没有运算保存,故递归回来的时候i的值一直都是0.