C++ 具有自定义数字的阶乘函数不';行不通
最近,我一直在研究一个库来处理具有数千位数的非常大的数字。 我现在为这些东西做了一个阶乘函数,因为我刚刚建立了乘法C++ 具有自定义数字的阶乘函数不';行不通,c++,class,math,friend,factorial,C++,Class,Math,Friend,Factorial,最近,我一直在研究一个库来处理具有数千位数的非常大的数字。 我现在为这些东西做了一个阶乘函数,因为我刚刚建立了乘法 largeNum factorial(largeNum& input) { if (input > one) return (input * factorial(--input)); else return one; } “one”是一个largeNum,定义为具有带“+”号的值“one”,因为我还没有实现整数转换 阶乘是largeNum类的友元函数
largeNum factorial(largeNum& input) {
if (input > one) return (input * factorial(--input));
else return one;
}
“one”是一个largeNum,定义为具有带“+”号的值“one”,因为我还没有实现整数转换
阶乘是largeNum类的友元函数。我没有得到任何语法错误,它必须是逻辑的
前缀--运算符已正确重载并已测试
乘法和“>”运算符也是如此
- 输入5返回24,即4李>
- 输入6返回120,即5!。 等等
干杯。回答您的问题:“意外”结果,即“输入5等于4!”,而不是5!”,与以下代码行引入的未定义行为有关:
input * factorial(--input)
< >注意C++中运算符的顺序主要是未定义的(例如,参见)。因此,factorial(--input)
在其结果乘以input
的值(同时发生变化?)之前,可能会进行求值。与副作用相结合,当操作改变相同(或其他)对象时,当相同(或其他)对象在同一表达式中使用时,如果中间没有序列点,通常会导致未定义的行为。正如操作n=++i+i代码>为UB(参见)
因此,这段代码有时可能会像您预期的那样运行,但也可能会完全不同
因此,如果--input
对input
的内容有副作用(我们可能会这样做),那么您的代码必须重写为
input * factorial(input-one)
其中,(输入-一)
不得以任何方式更改输入
。回答您的问题:“意外”结果,即“输入5得到4!”,而不是5!”,与以下代码行引入的未定义行为有关:
input * factorial(--input)
< >注意C++中运算符的顺序主要是未定义的(例如,参见)。因此,factorial(--input)
在其结果乘以input
的值(同时发生变化?)之前,可能会进行求值。与副作用相结合,当操作改变相同(或其他)对象时,当相同(或其他)对象在同一表达式中使用时,如果中间没有序列点,通常会导致未定义的行为。正如操作n=++i+i代码>为UB(参见)
因此,这段代码有时可能会像您预期的那样运行,但也可能会完全不同
因此,如果--input
对input
的内容有副作用(我们可能会这样做),那么您的代码必须重写为
input * factorial(input-one)
其中,(输入-一)
不得以任何方式更改输入
(当然,必须实施,以使其给出正确的结果)。您正在对评估顺序进行假设,这会导致未定义的行为。我建议将--input
更改为input-1
factorial
可能应该将参数作为常量引用,而不是无常量引用。“减号运算符很容易实现…”我想你说的是一元-
,它在这里并不相关。你的二进制-
看起来怎么样?为什么阶乘函数需要访问数字类的内部?换言之:为什么它是一个朋友呢?你在对评估顺序进行假设,这会导致未定义的行为。我建议将--input
更改为input-1
factorial
可能应该将参数作为常量引用,而不是无常量引用。“减号运算符很容易实现…”我想你说的是一元-
,它在这里并不相关。你的二进制-
看起来怎么样?为什么阶乘函数需要访问数字类的内部?换言之:为什么它是一个朋友呢?