问个递归调用的问题

来源:7-2 Linux C递归函数之递归原理

帅踢锅

2015-08-05 11:55

请问下面两段代码,为啥是其对应的输出结果呢?

1、输出:120(重点想问n--的执行顺序,以及为什么这样)

int step(int n)
{
    if (n > 1) {
        return n-- * step(n);
    } else {
        return 1;
    }
}
int main(int argc, char* argv[])
{
    int a = step(5);
    printf("%d", a);
    return 0;
}

2、输出:24

int step(int n)
{
    if (n > 1) {
        return n * step(--n);
    } else {
        return 1;
    }
}
int main(int argc, char* argv[])
{
    int a = step(5);
    printf("%d", a);
    return 0;
}


写回答 关注

1回答

  • onemoo
    2015-08-05 16:04:39
    已采纳

    C语言运算符有优先级和结合性,但是参与运算的操作数的求值顺序并没有规定。所以这两个代码是有问题的。

    第一个例子中:

    return 后面的 n-- 的值肯定是n,但是n自减在这个表达式中是什么时候发生的并不确定(在return语句后肯定减1了,但也没意义了)

    第二个例子:

    step的参数--n的值肯定是n-1,而且在函数调用后n的值也肯定是减1了,但是由于操作数的求值顺序未定,所以不能保证肯定先调用step函数。

    这两个代码的行为都是未定义的,能出运算结果不一定代表这就是“正确的”结果。

    帅踢锅

    非常感谢!解释很专业

    2015-08-06 19:40:24

    共 1 条回复 >

Linux C语言结构体

C语言的深入,帮助小伙伴们进一步的理解C语言,赶紧看过来

118294 学习 · 162 问题

查看课程

相似问题