我一直在读乔恩·埃里克森的书《黑客--剥削的艺术》(第二版,无淀粉出版社).在第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&lt;x始终为真.对我来说,这看起来像是一个无限的for循环,但我可能错了.我已经在出版商的网站上查看了勘误表,但我找不到解决我问题的信息.

如果我弄错了,有没有人能给我解释一下出了什么问题?我附上这本书的节选,以供参考.

excerpt from the book

推荐答案

你的观察是正确的.所写的函数将导致无限循环.这是因为条件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

C++相关问答推荐

变量的const视图是否定义良好?

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

为什么在C中设置文件的位置并写入文件,填充空字符?

有没有更简单的方法从用户那里获取数据类型来计算结果

*p[num]和(*p)num的区别

空指针的运行时强制转换

当输入负数时,排序算法存在问题

试图从CSV文件中获取双精度值,但在C++中始终为空

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

防止C++中递归函数使用堆栈内存

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

等同于铁 rust 的纯C语言S未实现!()宏

如何在C-函数中混合使用C代码和ASM?

可变宏不能编译

我在反转双向链表时遇到问题

如何修复我的qsort()算法?它每次都给出不同的结果

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

程序如何解释变量中的值

Makefile无法将代码刷新到ATmega328p

WSASocket在哪里定义?