Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有自定义数字的阶乘函数不';行不通_C++_Class_Math_Friend_Factorial - Fatal编程技术网

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
可能应该将参数作为常量引用,而不是无常量引用。“减号运算符很容易实现…”我想你说的是一元
-
,它在这里并不相关。你的二进制
-
看起来怎么样?为什么阶乘函数需要访问数字类的内部?换言之:为什么它是一个朋友呢?