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