gpt4 book ai didi

c++ - 给定代码中是否存在未定义的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:40 27 4
gpt4 key购买 nike

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:

  1. 3024
  2. 6561
  3. 55440
  4. 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com