2016-11-19 127 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