C 错误消息";格式‘;%ld’;应为类型为‘;长整型’;,但参数2的类型为‘;int’&引用;

C 错误消息";格式‘;%ld’;应为类型为‘;长整型’;,但参数2的类型为‘;int’&引用;,c,recursion,factorial,C,Recursion,Factorial,我正在编写一个简单的程序来查找前n个整数的阶乘。但在编译它时,我遇到了这个错误。即使fact()函数的返回类型是long int,错误仍然存在 #include <stdio.h> #include <stdlib.h> int main(){ int i; for(i=0;i<30;i++) printf("%ld\n", fact(i)); return 0; } long int fact(int n){ i

我正在编写一个简单的程序来查找前n个整数的阶乘。但在编译它时,我遇到了这个错误。即使fact()函数的返回类型是long int,错误仍然存在

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i;
    for(i=0;i<30;i++)
        printf("%ld\n", fact(i));
    return 0;
}

long int fact(int n){
    if(n==0)
        return 1;
    else 
        return (long)(n*fact(n-1));
}

您需要为
事实

long int fact(int n);
int main(){
    // body
}
long int fact(int n) {
    // body
}    

如果没有这一点,ANSIIC C假定一个没有事先声明或实现的函数将返回
int

您忘记在
main
之前包含函数原型。或者包括一个原型

long int fact(int n);
或者将函数定义移动到
main
之前

#include <stdio.h>
#include <stdlib.h>

long int fact(int n){
    if(n==0)
        return 1;
    else
        return (n*fact(n-1));
}

int main(){
    int i;
    for(i=0;i<30;i++)
        printf("%ld\n", fact(i));
    return 0;
}
#包括
#包括
长整型事实(整型n){
如果(n==0)
返回1;
其他的
返回(n*事实(n-1));
}
int main(){
int i;

对于(i=0;i…)和printf问题,只需删除
%
@JohnZwinck No之后的
l
,printf
问题是由于缺少
fact
的声明造成的。不应更改格式,因为
fact
返回
长int
@JohnZwinck我认为这不是必需的(或正确)。
fact
确实返回
long int
;提供转发声明应该是所需的全部。您当然是对的。这将向您展示我使用允许隐式函数声明的编译器选项有多长时间了!我很高兴它帮助了您:)为什么要在此处强制转换到
long
return(long)(n*fact(n-1));
这不是必需的,也不是推荐的!我最初尝试不进行强制转换,但出现了上述错误。本以为强制转换可以解决错误,但显然没有。我在粘贴到此处时忘记将其删除。现在才注意到。谢谢!
#include <stdio.h>
#include <stdlib.h>

long int fact(int n){
    if(n==0)
        return 1;
    else
        return (n*fact(n-1));
}

int main(){
    int i;
    for(i=0;i<30;i++)
        printf("%ld\n", fact(i));
    return 0;
}