该程序的行为方式,
fact(static int n)
{
int f=1;
if(n<=1) return 1;
else
{
f=n*fact(n-1);
return f;
}
}
函数如何调用和返回值取决于 n 以及为什么最终输出为 1。
register
函数参数声明中不允许使用存储类说明符(除了)。您的程序不是有效的 C 程序。
要使其有效,请更改:
fact(static int n)
至
int fact(int n)
请注意,MPLAB C18 编译器允许static
说明符将参数用作编译器扩展。来自MPLAB C18 用户指南:
2.3.2 静态函数参数
函数参数可以具有存储类 auto 或 static。一个自动参数被放置在软件堆栈上,可以重入。静态参数是全局分配的,可以直接访问通常较小的代码。静态参数仅在编译器在非扩展模式下运行时才有效(见第 1.2.5 节“选择模式”)。
一些嵌入式 C 编译器支持static
作为非标准扩展的参数说明符。对于这些编译器,static
意味着全局分配的参数(通常这样做是为了节省堆栈空间,这在嵌入式平台上可能非常有限)。
在这种情况下,static
参数的存在意味着函数不可重入(不能安全地递归)。全局分配n
只会在每次调用时更改,直到最后一次调用fact(1)
;随着递归展开,每个返回调用都会乘以n
(现在等于 1)到结果中,因此最终结果是一堆 1 相乘以产生最终结果。