2016-11-19 131 views
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函数调用首先被评估,为什么? 我发布的代码被简化了,所以不需要追踪它。 谢谢评估这个的顺序是什么?为什么? C++

+0

UB,参数'B'被修改不止一次 - :[注注完这样 初始化都不定相对于每个其他 测序。 –

回答

2

假设**有错别字,而不是语法错误,并使用以下命名:

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

的follwing是正确的:

  • (d)前计算(C ),因为调用(C)需要参数值。
  • (A)是(B),和(C)(并且因此(d))

更多不能说因为,C++标准让参数评估给编译器的排序后,评价:

5.2.2/4:当一个函数被调用时,每个参数应与其相应的参数进行初始化。

+0

我的意思是用**代表部分代码,谢谢,我想我现在明白了 – csguy

+0

这是UB,因为'b'被修改了。 –

+0

的确,在同一个变量上存在4个不确定的副作用,即UB。但是,在能够做出这种表述之前,首先必须确定它们没有排序(即没有定义的顺序),这正是这个问题的目标。 – Christophe