递归代码含糊不清的答案

时间:2013-02-14 01:09:54

标签: c recursion reference

如果在p之前将p的值初始化为5,则f(p,p)的返回值是多少 呼叫?请注意,第一个参数是通过引用传递的,而第二个参数是通过值传递的。

int f (int & x, int c )
{
    c = c − 1;
    if ( c == 0 ) return 1;
    x = x + 1;
    return f ( x, c ) * x;
}

(A)3024
 (B)6561
 (C)55440
 (D)161051

根据我的3024因为我们开始 f(5,5) f(6,4)*6 f(7,3)*7 f(8,2)*8 f(9,1)*9 那么1,我对参考部分return f ( x, c ) * x的电话有点困惑 x值会在每次调用后发生变化,还是会保持不变?

1 个答案:

答案 0 :(得分:4)

假设这实际上是C ++而不是C(因此引用声明有一定意义),结果是未指定的(但不是未定义的行为)。

问题在于,在表达式f(x,c) * x中,未指定程序是否会在调用x之前或之后评估第二个f(x,c)

请注意,由于此行为未指定,因此您根本不能依赖它 - 更改编译器选项可能会更改评估顺序。实际上,技术上允许编译器使用一个排序对f()的某些调用求值表达式,同时使用另一个顺序对f()进行其他调用(尽管我想这不会发生在{{1}}实践)。