c++ - 带有自定义数字的阶乘函数不起作用

标签 c++ class math friend factorial

最近我一直在开发一个库来处理具有数千位的非常大的数字。 我现在已经为这些东西研究了一个阶乘函数,因为我刚刚设置了乘法。

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 )。

因此,这段代码有时可能会像您预期的那样表现,但也可能表现得完全不同。

因此,如果 --inputinput 的内容有副作用(正如我们假设的那样),那么您的代码必须重写为

input * factorial(input-one)

其中 (input - one) 不得以任何方式改变 input(当然,必须实现它以提供正确的结果)。

关于c++ - 带有自定义数字的阶乘函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469170/

相关文章:

c++ - 临时将 unique_ptr 强制转换为原始指针

javascript - 访问渲染中从 react 函数返回的变量(在循环中)

python - 如何将类对象的所有方法的结果作为一个列表返回?

c++ - 对我的绘图项目的建议

math - 如何从3D向量获得偏航,俯仰和横滚

c++ - 重写私有(private)函数,它与 protected 函数有何不同?

c++ - 在 C++ 中填充灰度图像中的孔

c++ - boost scoped_lock。这个会锁吗?

java - 有没有办法将文件中的类实现到新文件中?

java - 从麦克风输入和 FFT 获取频率 - Java