《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
相关产品推荐
相关产品推荐

