在递归中使用--a和a-1有什么区别?

3

我试图使用递归来计算阶乘,就像这样:

#include <iostream>

using namespace std;

int factorial(int a)
{
    if(a == 0)
    {
        return 1;
    }
    return a*factorial(--a);
}

int main()
{
    int a;
    cin >> a;

    cout << factorial(a) << endl;

    return 0;
} 

之前它不能正常工作,然后我做了一个小改动:

#include <iostream>

using namespace std;

int factorial(int a)
{
    if(a == 0)
    {
        return 1;
    }
    return a*factorial(a-1);
}

int main()
{
    int a;
    cin >> a;

    cout << factorial(a) << endl;

    return 0;
} 

...然后它开始工作了!

问题在于我看不出这些代码之间有任何区别:为什么第一个代码没有起作用?


@eeorika 虽然我不否认你的重复关闭,但我认为我的答案仍然可以被视为有帮助的,因为你指定的目标并没有真正解决这里的具体问题,即使用 --a a-1 - Adrian Mole
1个回答

10
在你的第一个代码示例中,以下行为未定义:
return a * factorial(--a);

这是因为C++标准中没有规定是否使用a的“旧”或“新”(减少后)值来乘以factorial函数的返回值。

使用clang-cl编译会得到以下结果:

警告:未排序的修改和访问'a' [-Wunsequenced]

在您的第二个代码示例中,不存在这种歧义,因为a没有被修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接