最近我一直在开发一个库来处理具有数千位的非常大的数字。 我现在已经为这些东西研究了一个阶乘函数,因为我刚刚设置了乘法。
largeNum factorial(largeNum& input) {
if (input > one) return (input * factorial(--input));
else return one;
}
“one”是一个 largeNum,定义为具有“+”号的“one”值,因为我还没有实现整数转换。
阶乘是 largeNum 类的友元函数。我没有收到任何语法错误,它必须合乎逻辑。
前缀 -- 运算符已正确重载并经过测试。
乘法和“>”运算符也是如此。
- 输入 5 返回 24,即 4!
- 输入 6 返回 120,即 5!。 等等。
也许我只是因为 sleep 不足而完全失明,但我需要一些帮助。 干杯。
最佳答案
回答您的问题:“意外”结果,即“输入 5 得到 4!,而不是 5!”,与以下代码行引入的未定义行为有关:
input * factorial(--input)
请注意,C++ 中运算符的求值顺序大部分是未定义的(例如,参见 cppreference)。因此,可能会发生 factorial(--input)
在其结果乘以 input
的(同时更改?)值之前被评估的情况。与副作用一起,操作改变相同(或其他)对象,当在相同表达式中使用相同(或其他)对象而中间没有序列点时,这通常会导致未定义的行为。正如操作 n =++i + i;
是 UB(参见 evaluation order / undefined behaviour )。
因此,这段代码有时可能会像您预期的那样表现,但也可能表现得完全不同。
因此,如果 --input
对 input
的内容有副作用(正如我们假设的那样),那么您的代码必须重写为
input * factorial(input-one)
其中 (input - one)
不得以任何方式改变 input
(当然,必须实现它以提供正确的结果)。
关于c++ - 带有自定义数字的阶乘函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469170/