为了账号安全,请及时绑定邮箱和手机立即绑定

问个递归调用的问题

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

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 回答

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

第一个例子中:

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

第二个例子:

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

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

1 回复 有任何疑惑可以回复我~
#1

帅踢锅 提问者

非常感谢!解释很专业
2015-08-06 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

问个递归调用的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信