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

标签 c++ c c++11 undefined-behavior unspecified-behavior

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/

相关文章:

c++ - 如何从 C++ 访问 qml ListElement

C#:劫持近亲调用

c - Misra-C 2012 规则 10.1 bool 操作数用于表达式为 bool 类型的情况

c++ - find_if 与 lambda 和捕获变量

c++ - 颜色类型 3 的 PNG 图像纹理格式

c++ - vector (容器)是否需要使用 "allocator"?

c - 如何将字符从文件传递到指针

c - 使用rand函数时出错

c++ - 保留指向前一个循环值的指针?

c++ - 当可移植性很重要时,使用 C++ 0x/TR1 是否安全?