我正在分析代码而我不知道为什么它不起作用(当它编译时我变成了一个windows msg,程序不再工作而且需要关闭)
代码:
#include <stdio.h>
int factorial(int input)
{
if (input > 0)
{
return input *factorial(input--);
}
return 1;
}
int main()
{
printf("%d",factorial(23));
return 0;
}
所以起初我以为会有溢出,所以我尝试过像2和3这样的数字,仍然无法正常工作。 所以我想如果我添加
可能会有用int x = 23;
并将23与&#39;&amp; x&#39;交换。在打印功能。也没用。
感谢您的帮助。
答案 0 :(得分:3)
运算符input--
首先传递当前值,然后减少变量,并且
你得到了一个无限循环。
使用input * factorial(input - 1)
。
您可以使用input * factorial(--input)
。在这种情况下,input
将首先递减,然后使用,因此您可以打破无限递归。
但这是一个坏主意。事实是运算符(即在这种情况下为'*')可以按任何顺序计算操作数。 F.E.编译器可以计算第二个操作数,即factorial(--input)
,然后input
的值将递减。
在您的结果相乘后,您需要获得newInput * factorial(newInput)
{/ 1}}。
最令人担心的是,结果取决于编译器的版本或命令行的参数,因此您无法绝对预测它。
答案 1 :(得分:2)
表达式
return input *factorial(input--);
input
的后期增量。传递给factorial
的值仍为input
。
不仅如此,您还处于未定义的行为区域,因为input
也用于表达式。
给定input = 3
,
input *factorial(input--);
很容易:
2 *factorial(3);
或
3 *factorial(3);
您应该使用:
return input *factorial(input-1);