You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重构main函数的C阶乘函数调用后结果恒为1,求原因

阶乘函数调用结果恒为1的原因分析

核心错误:误用scanf的返回值

你重构后的代码中,factorial(scanf("%lu", &n))是把scanf的返回值传给了阶乘函数,这是问题的根源。

在C语言中,scanf的返回值不是输入的数值,而是成功读取的输入项数量。对于scanf("%lu", &n)来说,只要输入是有效的无符号整数,它就会返回1。这意味着你实际上一直在调用factorial(1),而你的阶乘函数中明确定义了当n == 1时返回1,所以无论输入什么,结果都会恒为1。

与Python写法的本质区别

你提到Python中类似的写法能正常运行,是因为Python里的input()函数返回的是用户输入的字符串,转成整数后就是输入的实际值;但C的scanf设计逻辑完全不同——它负责将输入解析到指定变量中,返回值仅用于判断解析是否成功,而非输入内容本身。

阶乘函数的额外问题(非本次核心错误)

你的阶乘函数还有一个小缺陷:当n <= 0时,仅打印提示但没有明确返回值,最终会走到最后的return 0。但unsigned long是无符号类型,返回0不符合阶乘的数学定义(0的阶乘是1),建议修正为:

unsigned long factorial(unsigned long n){
    if(n == 0 || n == 1){
        return 1;
    }
    else if(n > 1){
        return n * factorial(n - 1);
    }
    printf("Invalid input for factorial\n");
    return 0;
}

正确的简洁写法

如果想保持代码简洁,正确的写法是先确保scanf成功读取变量,再传入阶乘函数:

int main(){
    unsigned long n = 0;
    if(scanf("%lu", &n) == 1){
        printf("%lu\n", factorial(n));
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Socks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:43:14