C 语言中计算阶乘的函数正确吗?

Dat*_*wer 3 c function factorial

我一直在读 Jon Erickson 的书《黑客——剥削的艺术》(第二版,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);
Run Code Online (Sandbox Code Playgroud)

书中写道,变量 b 将包含 120,因为阶乘函数将以 5 为参数调用,并将返回 120。

它是否正确?据我所知,x 在每次迭代中都会被分配一个新数字,因此条件 i < x 始终为真。对我来说这看起来像是一个无限循环,但我可能是错的。我已经检查了出版商网​​站上的勘误表,但找不到可以解决我的问题的信息。

如果我犯了一个错误,有人可以向我解释一下哪里出了问题吗?我附上该书的摘录以供参考。

书中摘录

小智 6

你的观察是正确的。所编写的函数将导致无限循环。这是因为条件 i < x 将始终为真,因为 x 在循环的每次迭代中都会增加 (x *= i)。

根据您的实现,我将创建另一个变量来保存结果,如下所示:

int factorial(int x)
{
   int i;
   int result = 1;
   for (i = 1; i <= x; i++)
      result *= i;
   return result;
}
int a=5, b;
b = factorial(a); // expected result = 120
Run Code Online (Sandbox Code Playgroud)

  • 乘以一并没有多大意义。循环应从 2 开始。 (2认同)