-5

该程序的行为方式,

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

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

4

2 回答 2

2

register函数参数声明中不允许使用存储类说明符(除了)。您的程序不是有效的 C 程序。

要使其有效,请更改:

fact(static int n)

int fact(int n)

请注意,MPLAB C18 编译器允许static说明符将参数用作编译器扩展。来自MPLAB C18 用户指南

2.3.2 静态函数参数

函数参数可以具有存储类 auto 或 static。一个自动参数被放置在软件堆栈上,可以重入。静态参数是全局分配的,可以直接访问通常较小的代码。静态参数仅在编译器在非扩展模式下运行时才有效(见第 1.2.5 节“选择模式”)。

于 2013-08-03T09:29:10.903 回答
2

一些嵌入式 C 编译器支持static作为非标准扩展的参数说明符。对于这些编译器,static意味着全局分配的参数(通常这样做是为了节省堆栈空间,这在嵌入式平台上可能非常有限)。

在这种情况下,static参数的存在意味着函数不可重入(不能安全地递归)。全局分配n只会在每次调用时更改,直到最后一次调用fact(1);随着递归展开,每个返回调用都会乘以n(现在等于 1)到结果中,因此最终结果是一堆 1 相乘以产生最终结果。

于 2013-08-03T09:35:04.367 回答