2010-09-25 93 views
6
#include <iostream> 
using namespace std; 

void f(int x, int y){ 

     cout << "x is " << x << endl; 
     cout << "y is " << y << endl; 
} 



int main(){ 

     int i = 7; 
     f(i--,i--); 
     cout << i << endl<< endl; 
} 

我們預期的程序以打印 「x爲7 \ ny表示6 \ ni爲5」柱和預遞增,遞減在C++

但印刷「的節目x爲6 \ ny表示7 \ ni is 5「

回答

11

f(i--,i--);調用Undefined Behaviour。不要寫這樣的代碼。

EDIT

逗號,存在於上述表達式不是Comma operator。它只是一個分隔參數(而不是序列點)的分隔符。

此外,函數參數的評估順序是未指定的,但表達式會調用未定義的行爲,因爲您試圖修改i兩次兩個序列點。

烏夫我累了。 :(

+0

完全同意在同一語句中兩次使用{in,de}加載操作符是非常糟糕的 – Benoit 2010-09-25 11:07:42

+1

@Downvoter:答案是完全正確的,請解釋你的downvote。 – 2010-09-25 11:11:39

+0

@Svisstack:函數調用中出現的'','不是'逗號操作符',它只是一個分隔符,它不是一個序列點。 – 2010-09-25 11:15:43

2

這告訴你參數正在從右到左評估,而不是從左到右,這可能是因爲調用約定或其他原因,但它通常是一個壞主意依賴於函數參數評估的順序

+0

這是調用約定,參數從右到左到堆棧 – Aillyn 2010-09-25 13:55:58

+0

@Aillyn:錯誤。它們可能是它的編譯器工作原理,但它並沒有在標準中實際定義。誰說這些參數甚至放在堆棧上進行函數調用。 (如果這是C,你可能會更正確,但這是C++和ABI未定義(故意))。 – 2010-09-25 18:29:16