【问题标题】:Factorial program with STATIC INT [duplicate]带有 STATIC INT 的阶乘程序 [重复]
【发布时间】:2013-08-04 13:51:38
【问题描述】:

这个程序的行为方式,

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

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

【问题讨论】:

  • 如果这是嵌入的 C 代码,static 表示参数是全局分配的;因此,该函数不可重入(无法安全递归)。
  • 你必须在两种情况下都返回 f ,但是在递归调用该函数之后你最终返回 1 所以最终输出是 1。

标签: c recursion factorial


【解决方案1】:

函数参数声明中不允许使用存储类说明符(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 节“选择模式”)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多