为什么该C语言阶乘实现程序输入5输出8,未得到正确阶乘结果?
C语言阶乘代码结果异常原因分析
你的代码存在三处核心逻辑错误,共同导致结果不符合预期:
- if判断的逗号运算符逻辑错误
C语言中逗号表达式的最终取值为最后一个子表达式的计算结果,你编写的if (a >= 1, a--)不会将a >= 1作为判断条件,实际判断的是a--的返回值(即a自减前的原值)。输入5进入FAC函数时,a初始为5,执行逗号表达式后a变为4,条件判断因5为非0值成立。 - return语句优先级错误+递归代码无法执行
你预期计算的是(a+1)*a,但C语言中乘法优先级高于加法,a + 1 * a实际等价于a + (1 * a) = 2*a。同时你将递归调用FAC(a);放在了return语句之后,该行代码永远不会被执行,递归逻辑完全失效,函数第一次满足条件就直接返回2*4=8,和你得到的输出完全一致。 - 缺少递归基线返回逻辑
当a自减到0时if条件不成立,函数没有定义返回值,会返回未定义的随机值,即使前面逻辑修正也会导致结果异常。
修正后的参考代码
#include <stdio.h> int FAC(int a) { // 基线条件:0和1的阶乘都是1 if (a <= 1) { return 1; } // 递归逻辑:n! = n * (n-1)! return a * FAC(a - 1); } int main() { int a = 0; int ret = 0; scanf("%d", &a); ret = FAC(a); printf("%d\n", ret); return 0; }
内容的提问来源于stack exchange,提问作者tree
相关产品推荐
相关产品推荐

