c++ - C++ 中的自减运算符

标签 c++ function recursion operator-keyword

我是C出身,现在正在用C++学习OOP

下面是一个计算阶乘的程序。

#include <iostream>

using namespace std;

void main ()
{
    char dummy;
    _int16 numb;
    cout << "Enter a number: ";
    cin >> numb;

    double facto(_int16);

    cout << "factorial = " <<facto(numb);
    cin >> dummy;
}

double facto( _int16 n )
{
    if ( n>1 )
        return ( n*facto(n-1) );
    else
        return 1;
}

上面的代码工作正常。

但是如果我替换返回语句

    return ( n*facto(n-1) );  

有了这个

    return ( n*facto(n--) );

那就不行了。 n-- 不会将 n 减 1。为什么?

我正在使用 Visual Studio 2012

编辑:知道了!谢谢 :)
*此外,我想补充以下答案:使用 --n 将导致 n 在语句执行前递减。因此,由于预递减,表达式将变为 (n-1)*facto(n-1) 。这就是为什么在这种情况下最好不要使用预递减 *

最佳答案

目前,通过使用 n--,您将 n 的原始值(因此未修改值)传递给 facto,这会导致循环。

您需要改用n - 1。从表面上看,使用 --n 会很诱人,因为这会减少 n 并评估为新的(较低的)值。但是 --n 会给你未定义的行为,因为你将函数返回值预乘以 n 并且因为 * 不是序列点n 的值未明确定义。

(顺便说一下,C 中的行为是相同的)。

[编辑:感谢 Mike Seymour 关于未定义行为的观点]。

关于c++ - C++ 中的自减运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22405031/

相关文章:

c++ - 试图删除指针触发断点

c++ - 我的VSCode调试器未显示任何变量值(附加图像)(C++)

c++ - 如何返回带有私有(private)比较器的 std::set

java - 如何在 Java 中使用递归从数组中删除

c++ - 使用 Barabási-Albert 模型计算和理解无标度网络

r - R : Pass argument to glm inside an R function

javascript - 如果排除对象类型,如何删除后面的函数参数并将其移至左侧?

python - 在函数内、函数外使用声明的值

java - 1 - 10000 Java 之间友好数字的递归方法

C : recursively defined program to calculate determinant of a matrix