带有STATIC INT的因子程序

时间:2013-08-03 09:27:43

标签: c recursion factorial

该程序的行为,

fact(static int n)
{
  int f=1;
  if(n<=1) return 1;
  else
  {
   f=n*fact(n-1);
   return f;
  }
}

函数调用和返回值如何取决于n以及最终输出为1的原因。

2 个答案:

答案 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乘以一起产生最终结果。