What is the return value of f(p,p), if the value of p is initialized to 5 before the call? Note that the first parameter is passed by reference, whereas the second parameter is passed by value.
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
Options are:
- 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,( see 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的 key 错了吗?或者真的是问题的错误?
最佳答案
return f(x,c) * x;
这个操作的结果取决于对这两个事物求值的顺序。由于您无法预测它们的评估顺序,因此您无法预测此操作的结果。
关于c++ - 给定代码中是否存在未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859502/