为什么这个递归程序有效?

时间:2016-04-01 12:55:01

标签: c++ recursion

#include <iostream>

using namespace std;

int main() {
    int n,x;
    int fact(int);

    cin >> n;

    x = fact(n);

    cout << x;

    return 0;
}

int fact(int n) {
    if(n!=1)
        return n*fact(n-1);
}

在最后一种情况下,当传递给函数fact的参数为1时,如果我在代码中没有指定它,它如何计算fact(1)等于1?

2 个答案:

答案 0 :(得分:10)

此程序依赖于未定义的行为。它肯定不能保证工作,但您可能已经发现了一个情况,即您发送的参数(1)位于调用代码将其视为返回值的位置。 依赖于此行为。

许多C ++编译器会拒绝此代码,因为它存在语义问题:并非所有控制路径都返回 fact()

中的值

答案 1 :(得分:2)

int fact(int n);

此函数签名返回一个整数,但是当给出n = 1时,实现中没有相应的return语句。在这种情况下,函数可能返回任何int值(即内存中的垃圾),行为未定义。您不应该依赖于此,即使您的编译器允许它运行。

我很确定您在编译程序时看到了警告。在我的环境中(Mac OSX上的g ++),编译器发出以下警告:

  

警告:控制可能会达到非空函数的结束[-Wreturn-type]

就个人而言,我认为编译器没有任何理由允许这种错误(即它应该无法编译)。

参考:类似的问题如下:

C++ return value without return statement