0

在 gcc 4.7.2 (Ubuntu Server 12.10) 上编译此代码时遇到问题

#include <stdio.h>

int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

我知道这可以用一个参数函数来完成,但这不是重点。

我得到的错误是:'fact'的冲突类型(函数声明行)先前隐式声明的事实在这里(与printf行)

4

2 回答 2

6

fact在您调用它之前,您需要一个前向声明main

long int fact(long int n, long int a); // forward declaration
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a) // actual function

在这种情况下,您可以只移动fact上面的实现。main但是请注意,这种方法不会扩展到更复杂的程序,这些程序具有更长的函数相互调用。

ADD 你的阶乘函数是错误的。这是更正的版本

long int fact(long int n)
{
   if (a == 1)
      return (n);
   return n * fact(n - 1);
}
于 2013-01-16T22:38:50.053 回答
0
#include <stdio.h>
long int fact(long int n, long int a);
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

你需要一个函数原型,它基本上是函数的第一行带分号。这将告诉编译器该函数存在。

于 2013-01-16T22:40:42.590 回答