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给4!而不是5!",与下面的代码行引入的未定义行为有关:
input * factorial(--input)
Run Code Online (Sandbox Code Playgroud)
请注意,C++中运算符的求值顺序大多未定义(参见,例如,cppreference).因此,可能会factorial(--input)在结果乘以(同时改变?)值之前进行评估input.与副作用相结合,当操作改变相同(或其他)对象时,当在同一表达式中使用相同(或另一个)对象而其间没有序列点时,这通常会导致未定义的行为.正如操作n = ++i + i;是UB(参见评估顺序/未定义行为).
因此,此代码有时可能会按预期运行,但也可能表现完全不同.
因此,如果--input对input(我们可能会认为)的内容有副作用,那么必须重写您的代码
input * factorial(input-one)
Run Code Online (Sandbox Code Playgroud)
在哪里(input - one)不得input以任何方式改变(并且必须实施,以便它给出正确的结果).