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

Fol*_*ing 2 c++ math class friend factorial

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

largeNum factorial(largeNum& input) {
    if (input > one) return (input * factorial(--input));
    else return one;
}
Run Code Online (Sandbox Code Playgroud)

"one"是一个largeNum被定义为具有"一"的值,带有"+"符号,因为我还没有实现整数转换.

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

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

乘法和">"运算符也是如此.

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

也许我只是因为我有点睡眠不足而失明,但我需要一些帮助.干杯.

Ste*_*ner 5

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

input * factorial(--input)
Run Code Online (Sandbox Code Playgroud)

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

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

因此,如果--inputinput(我们可能会认为)的内容有副作用,那么必须重写您的代码

input * factorial(input-one)
Run Code Online (Sandbox Code Playgroud)

在哪里(input - one)不得input以任何方式改变(并且必须实施,以便它给出正确的结果).