0
int foo(int a, int& b, int c) {
    int temp = a;
    a = b;
    b = c;
    c = temp;
    return a - b;
}

int main() {


**foo(foo(a, b, c), b, foo(a, b, foo(a, b, c)));**


return 0;
}

首先评估哪个 foo 函数调用,为什么?我发布的代码已简化,因此无需跟踪它。谢谢你

4

1 回答 1

2

假设**是拼写错误而不是语法错误,并使用以下命名:

 (A)      (B)          (C)       (D) 
foo ( foo(a, b, c), b, foo(a, b, foo(a, b, c)))

以下是正确的:

  • (D) 在 (C) 之前评估,因为调用 (C) 需要参数值。
  • (A) 在 (B) 之后评估,并且 (C) (因此 (D) )

不能说更多,因为 C++ 标准允许对编译器进行参数评估的排序:

5.2.2/4:当一个函数被调用时,每个参数都应该用其对应的参数进行初始化。[注意:此类初始化相对于彼此的顺序是不确定的-结束注释]

于 2016-11-19T19:45:25.127 回答