C语言阶乘计算出现负数结果,请求代码问题排查帮助
问题排查与修正
你的代码存在三个核心问题,直接导致了异常输出:
1. 循环条件依赖被修改的变量,导致循环无法正常终止
在foo函数的循环for (int i = 1; i < x; i++)中,你在循环体里不断执行x = x * i修改x的值。原本你想计算4的阶乘,但修改后的x增长速度远快于i,循环会一直执行直到x因为整数溢出变成负数,此时i < x不成立才会终止——这就是你看到一长串输出最后出现负数的原因。
2. 混淆输入参数与结果存储变量
你用同一个变量x既保存原始输入值(用来控制循环次数),又存储阶乘的累积结果,完全打乱了逻辑。正确的做法是保留原始输入值作为循环上限,用单独的变量存储阶乘结果。
3. printf调用格式错误
main函数里的printf(m)是错误用法,printf的第一个参数必须是格式字符串;同时你的foo函数返回0,根本没返回阶乘结果。
修正后的代码
#include <stdio.h> // 计算n的阶乘,返回结果 long long foo(int n) { long long result = 1; // 用原始输入n作为循环上限,避免被修改影响 for (int i = 1; i <= n; i++) { result *= i; // 可选:打印每一步的累积结果 printf("%lld ", result); } return result; } int main() { int x = 4; long long factorial = foo(x); // 打印最终结果 printf("\n%d的阶乘是:%lld\n", x, factorial); return 0; }
额外说明
- 改用
long long类型存储阶乘结果:int的范围通常只能容纳到12!(479001600),13!就会溢出,long long可以支持到更大的数值(最多到20!左右,超过后依然会溢出,需用大数库)。 - 循环条件改为
i <= n:因为n的阶乘是1×2×…×n,包含n本身。
内容的提问来源于stack exchange,提问作者Hiro Harmada
相关产品推荐
相关产品推荐

