C 析码阶乘函数

C 析码阶乘函数,c,factorial,C,Factorial,我正在分析一个代码,我不知道为什么它不工作(当它编译时,我变成了一个windows msg,程序不再工作,需要关闭) 代码: 并在打印功能中将23与“&x”交换。也不管用 谢谢您的帮助。运算符输入--首先传递当前值,然后减小变量,然后 你得到了一个无限循环 使用input*factorial(input-1) 您可以使用input*factorial(--input)。在这种情况下,输入将首先递减,然后使用,因此您将中断无限递归 但这是个坏主意。事实上,运算符(即本例中的“*”)可以按任意顺序计

我正在分析一个代码,我不知道为什么它不工作(当它编译时,我变成了一个windows msg,程序不再工作,需要关闭)

代码:

并在打印功能中将23与“&x”交换。也不管用

谢谢您的帮助。

运算符
输入--
首先传递当前值,然后减小变量,然后 你得到了一个无限循环

使用
input*factorial(input-1)

您可以使用
input*factorial(--input)
。在这种情况下,
输入将首先递减,然后使用,因此您将中断无限递归

但这是个坏主意。事实上,运算符(即本例中的“*”)可以按任意顺序计算操作数。F.e.编译器可以计算第二个操作数,即
阶乘(--input)
,然后
input
的值将递减

相乘后,您的结果将是
newInput*factorial(newInput)
,而您希望获得
oldInput*factorial(newInput)

最令人担忧的是,结果取决于编译器的版本或命令行的参数,因此您无法绝对预测它。

运算符
输入--
首先传递当前值,然后减小变量,然后 你得到了一个无限循环

使用
input*factorial(input-1)

您可以使用
input*factorial(--input)
。在这种情况下,
输入将首先递减,然后使用,因此您将中断无限递归

但这是个坏主意。事实上,运算符(即本例中的“*”)可以按任意顺序计算操作数。F.e.编译器可以计算第二个操作数,即
阶乘(--input)
,然后
input
的值将递减

相乘后,您的结果将是
newInput*factorial(newInput)
,而您希望获得
oldInput*factorial(newInput)

最令人担忧的是,结果取决于编译器的版本或命令行的参数,因此您无法绝对预测它。

表达式

return input *factorial(input--);
执行
输入的后期增量
。传递给
factorial
的值仍然是
input

不仅如此,您还处于未定义的行为领域,因为表达式中还使用了
input

给定
输入=3

input *factorial(input--);
很可能是:

2 *factorial(3);

你应使用:

return input *factorial(input-1);
表情

return input *factorial(input--);
执行
输入的后期增量
。传递给
factorial
的值仍然是
input

不仅如此,您还处于未定义的行为领域,因为表达式中还使用了
input

给定
输入=3

input *factorial(input--);
很可能是:

2 *factorial(3);

你应使用:

return input *factorial(input-1);

如果您使用
--input
,则您处于未定义的行为区域,因为表达式中也使用了
input
。@RSahu,您是对的,最好使用
input-1
。我已经更正了我的答案。谢谢你的回答,现在它工作得很好:)UB比未指定的排序更糟糕。这是前者。这一结论抓住了本质:如果您使用
--input
,则您处于未定义的行为领域,因为表达式中也使用了
input
。@RSahu,您是对的,最好使用
input-1
。我已经更正了我的答案。谢谢你的回答,现在它工作得很好:)UB比未指定的排序更糟糕。这是前者。这句话抓住了要点:15秒评论暂停,现在我太早按了4次按钮,所以倒计时重置xD谢谢你的回答,现在它工作得很好:)15秒评论暂停,现在我太早按了4次按钮,所以倒计时重置xD谢谢你的回答,现在它工作得很好:)