如果 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; }
选项是:
- 3024
- 6561
- 55440
- 161051
我试图解释:
在这段代码中,将有四个递归调用,参数为 (6,4)、(7,3)、(8,2) 和 (9,1)。最后一次调用返回 1。但是由于通过引用传递,之前所有函数中的 x 现在都是 9。因此, f(p,p) 返回的值将是 9 * 9 * 9 * 9 * 1 = 6561。
这个问题来自竞争性考试 GATE,(参见 Q.no.-42)。答案键由 GATE “Marks to all”给出(意味着没有正确的选项。)key set-C, Q.no.-42。某处解释为:
在 GATE 2013 中,所有人都获得了标记,因为 C/C++ 中的相同代码会产生未定义的行为。这是因为*
不是 C/C++ 中的序列点。正确的代码必须替换
return f(x,c) * x;
和
res = f(x,c);
return res * x;
但是给定的代码工作正常。GATE的钥匙错了吗?或者真的是问题的错误?