最近我一直在研究一个库来处理数千个数字的非常大的数字。 我现在已经为这些事情开发了一个阶乘函数,因为我只是设置了乘法。
largeNum factorial(largeNum& input) {
if (input > one) return (input * factorial(--input));
else return one;
}
“one”是一个largeNum,定义为具有“+”的值,因为我还没有实现整数转换。
Factorial是largeNum类的友元函数。我没有得到任何语法错误,它必须是合乎逻辑的。
前缀 - 运算符已正确重载并进行了测试。
乘法也是“>”操作
也许我只是盲目失明,因为我有点睡眠不足,但我需要一些帮助。 欢呼声。
答案 0 :(得分:5)
回答你的问题:“意外”结果,即“输入5给4!而不是5!”,与以下代码行引入的未定义行为有关:
input * factorial(--input)
请注意,C ++中运算符的求值顺序大多未定义(例如,参见cppreference)。因此,在factorial(--input)
的结果乘以input
的(同时改变?)值之前,可能会发生n = ++i + i;
的评估。与副作用相结合,当操作改变相同(或其他)对象时,当在同一表达式中使用相同(或另一个)对象而其间没有序列点时,这通常会导致未定义的行为。正如操作--input
是UB(参见evaluation order / undefined behaviour)。
因此,此代码有时可能会按预期运行,但也可能表现完全不同。
因此,如果input
对input * factorial(input-one)
的内容产生副作用(我们可能认为),那么您的代码必须重写为
(input - one)
其中input
不得以任何方式更改getType1()
(并且必须实施以使其提供正确的结果)。