递归中的默认返回值

时间:2014-07-23 02:30:11

标签: c++ c recursion

考虑以下众所周知的代码来查找数字的阶乘。

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

现在考虑另外一个

的变体
int fact(int num)
{
    if (num != 1)
        return num * fact(num - 1);
}

第一个看起来很干净,如果我们将num作为4,那么它将是4*3*2*1。第二个也工作正常,即使编译器可能会发出警告。但是在后者中,如果num变为1则没有返回语句。那么计算如何发生?如果num为1,则代码仅在返回1时才有效。任何人都可以解释这里发生的事情4*3*2*x。如何将x返回为1.谢谢。

编辑:我正在使用gcc 4.8.2

3 个答案:

答案 0 :(得分:3)

第二种变体是不正确的,没有"默认返回值"这种行为完全未定义!

考虑一下,编译器将如何知道fact(1) == 1 ??

如果你让我猜,我会说你想避免使用else的东西,在这种情况下,默认的返回值应该是最后一句。

int fact(int num)
{ // pre: num > 0
    if (num != 1)
        return num * fact(num - 1); 
    return num;
}

答案 1 :(得分:2)

第二段代码不正确,您认为不重要的警告可能是:

  

警告:控制到达非空函数的结尾

您必须在所有路径中提供返回值,否则(当num1时)它的未定义行为,没有默认返回值main除外)。

答案 2 :(得分:0)

这是一种未定义的行为,这意味着结果完全取决于特定的编译器。因此,我认为你应该尽量避免它。