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

《Hacking - the art of exploitation》中C阶乘函数是否正确?

这段计算阶乘的C代码是否会陷入无限循环?

我正在阅读Jon Erickson所著《Hacking - the art of exploitation》(第二版,No Starch Press),在第17页看到一段用于计算阶乘的C语言代码。我具备Python编程能力,但C语言是新手。代码如下:

int factorial(int x)
{
  int i;
  for(i=1; i < x; i++)
    x *= i;
  return x;
}

int a=5, b;
b = factorial(a);

书中称变量b的值为120,因为传入参数5时该函数会返回120。但我认为循环中x不断被赋值,i < x的条件始终成立,这是一个无限循环。我已查阅出版社官网的勘误,但未找到相关解答。请问这段代码是否正确?


你的理解完全正确——这段代码确实会陷入无限循环,书中的描述存在错误。

原因在于循环的判断条件i < x中,x的值在循环体里被持续修改:每次循环x会乘以当前的i,而i仅仅是每次加1。x的增长速度远快于i,因此i < x的条件永远为真,循环永远不会终止,自然也不会返回120。

要实现正确的阶乘计算,应该避免修改作为判断条件的输入参数,而是使用一个单独的变量存储计算结果,比如:

int factorial(int x)
{
  int result = 1;
  for(int i = 1; i <= x; i++)
    result *= i;
  return result;
}

或者如果要保留类似原代码的结构,需要用临时变量保存初始的输入值作为循环终止条件:

int factorial(int x)
{
  int original_x = x;
  int i;
  for(i = 1; i < original_x; i++)
    x *= i;
  return x;
}

当传入5时,这段修正后的代码会正确计算5! = 120并返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:25:22