2012-05-29 77 views
1

我明白與C++表達式評估。 「評估」是什麼意思?

int i=0; 
foo(i++, i++); 

經典的例子問題,但我無法說服以下是有效還是無效自己

int foo(int& i) 
{ 
    i=42; 
    return 99; 
} 

bar(foo(i), i); 

據我瞭解,爲了「富(I) '和'我'的評估是未定義的,但「評估」究竟意味着什麼?即bar的第二個參數總是爲42,還是可以在foo改變之前傳入'i'的當前值?

+1

訂單未指定,未定義... –

+0

類似的帖子在這裏,http://stackoverflow.com/questions/10782863/what-is-the-correct-answer-for-cout-cc –

回答

4

不,不保證。
參數對函數的評估順序是未指定[參考文獻1]
它可以是可能的,或者:

  • foo(i)獲取評估第一或
  • i獲取評估或
  • 任何其他神奇順序(在參數情況下數爲兩個以上的

在此上下文中未指定意味着允許實現以所需方式實現所述功能並且不需要記錄。


[參考1]
C++ 03 5.2.2功能呼叫 第8段

的參數評價的順序是不確定的。參數表達式評估的所有副作用在輸入函數之前生效。未指定後綴表達式和參數表達式列表的評估順序。

+0

什麼是「任何其他神奇的秩序「?還有其他的可能嗎? –

+0

@OliCharlesworth:修改使其更清楚。 –

+0

謝謝。我的困惑在於「評估」的實際含義,例如表達'我'不需要評估(現在我說這樣看起來更明顯) –

0

該樣品(GCC 4.6)

#include <iostream> 
using namespace std; 

int foo(int& i) 
{ 
    i=42; 
    return 99; 
} 

void bar(int i, int j) 
{ 
    cout << "i = " << i << "; j = " << j << endl; 
} 

int main() 
{ 
    int i =10; 
    bar(foo(i), i); 
    return 0; 
} 

給出I = 99,J = 10。

所以確實不能保證。