具有自定义数字的阶乘函数不起作用

时间:2017-04-18 10:04:06

标签: c++ class math friend factorial

最近我一直在研究一个库来处理数千个数字的非常大的数字。 我现在已经为这些事情开发了一个阶乘函数,因为我只是设置了乘法。

largeNum factorial(largeNum& input) {
    if (input > one) return (input * factorial(--input));
    else return one;
}

“one”是一个largeNum,定义为具有“+”的值,因为我还没有实现整数转换。

Factorial是largeNum类的友元函数。我没有得到任何语法错误,它必须是合乎逻辑的。

前缀 - 运算符已正确重载并进行了测试。

乘法也是“>”操作

  • 输入5返回24,即4!
  • 输入6返回120,即5!。 等等。

也许我只是盲目失明,因为我有点睡眠不足,但我需要一些帮助。 欢呼声。

1 个答案:

答案 0 :(得分:5)

回答你的问题:“意外”结果,即“输入5给4!而不是5!”,与以下代码行引入的未定义行为有关:

input * factorial(--input)

请注意,C ++中运算符的求值顺序大多未定义(例如,参见cppreference)。因此,在factorial(--input)的结果乘以input的(同时改变?)值之前,可能会发生n = ++i + i;的评估。与副作用相结合,当操作改变相同(或其他)对象时,当在同一表达式中使用相同(或另一个)对象而其间没有序列点时,这通常会导致未定义的行为。正如操作--input是UB(参见evaluation order / undefined behaviour)。

因此,此代码有时可能会按预期运行,但也可能表现完全不同。

因此,如果inputinput * factorial(input-one) 的内容产生副作用(我们可能认为),那么您的代码必须重写为

(input - one)

其中input不得以任何方式更改getType1()(并且必须实施以使其提供正确的结果)。