重构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
相关产品推荐
相关产品推荐

