【问题标题】:Recursion code ambigious answer递归代码模棱两可的答案
【发布时间】:2013-02-14 09:51:39
【问题描述】:

如果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
(四) 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 的值会改变还是保持不变?

【问题讨论】:

  • int f (int & x, int c ) 是 C 中的语法错误。您使用的是 C++ 吗?
  • 它是在硕士竞争考试中被问到的......我认为它只是 c 中的代码
  • 也许这是一个技巧问题? C 没有“引用”;只有指针。
  • 该代码在 C 中无效。该代码在 C++ 中具有不可预测(未指定)的行为。换句话说,A-D 答案都不适用。

标签: c recursion reference


【解决方案1】:

假设这真的是 C++ 而不是 C(所以引用声明是有道理的),结果是未指定的(但不是未定义的行为)。

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

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2018-05-30
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多