任务描述
本关任务:利用静态局部变量,编写函数计算n
的阶乘。
相关知识
内存提供用户使用的空间分为:代码区、常量区、静态存储区和动态存储区。
图1 内存分布图
从变量值存在的时间(即生存期)观察,有两种不同的方式:静态存储方式和动态存储方式。 变量的存储类别是指编译器为变量分配内存的方式,它决定变量的生存期,即决定变量何时“生”,何时“灭”。 静态存储区中的变量:与程序“共存亡” 动态存储区中的变量:与程序块“共存亡”
在 C 语言中每一个变量都有两个属性:数据类型和存储类别。在定义变量时,存储类别声明符要放在数据类型的前面。
auto变量
函数中的局部变量,如不特别声明为static
变量,都是动态地分配存储空间的。auto
关键字可以省略,即如果变量的前面没有说明存储类别,则默认该变量的存储类别为auto
类型。如:int a;
等价于 auto int a;
。
调用函数时,系统会给动态局部变量分配存储空间,调用结束时就自动释放空间。因此,自动变量也称为动态局部变量。
static局部变量
如果希望函数中的局部变量,在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值),这时就应该指定该局部变量为静态局部变量,用关键字static
进行声明。
通过示例观察静态变量的值。
#include <stdio.h>
int func(int n);
int main()
{
int i;
for (i=1; i<=4; i++)
{
printf("第%d次:%d\n", i, func(i));
}
return 0;
}
int func(int n)
{
static int p = 10; /*定义静态局部变量*/
p ++;
return p;
}
运行结果为: 第1次:11
第2次:12
第3次:13
第4次:14
静态局部变量p
在编译时赋初值的,即只赋一次初值。在整个程序运行期间p
内存不释放,以后每次调用func()
函数时不再重新赋初值,而是保留上次函数调用的结果。 如果将定义变量p
时的关键字static
改为 auto
,再次运行程序,会发现p
的记忆功能消失了,运行结果为: 第1次:11
第2次:11
第3次:11
第4次:11
因为自动变量是在动态存储区分配内存的,其占据的内存在退出函数后立即被释放了,在每次调用函数时都需要重新初始化,因此,自动变量的值不能保持到下一次进入函数时。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,编写函数利用静态局部变量计算n
的阶乘,n
由后台获取。
测试说明
平台会对你编写的代码进行测试。
测试输入: 6
预期输出: 1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
开始你的任务吧,祝你成功!
#include <stdio.h>
long fact(int n);
/********** Begin **********/
void main()
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("%d! = %d\n",i,fact(i));
}
long fact(int n)
{
static long p=1 ;
p=p*n;
return p;
}