2011-02-25 40 views
1

可能重複:
cout << order of call to functions it prints?訂單與關聯性

是什麼評價化合物表達順序時和關聯性之間的區別?

在以下示例中,我沒有看到表達式的result上的順序的影響。 result始終爲3,因爲算術運算符是左關聯的,函數將從左到右調用。

#include <iostream> 
using std::cout; 
using std::endl; 

int Func1(int &i) 
{ 
    return i; 
} 

int Func2(int &i) 
{ 
    return i++; 
} 

int main() 
{ 
    for (int index = 0; index < 999999999; index++) 
    { 
     int i = 0; 

     int result = (Func2(i) + Func1(i) + Func1(i) + Func2(i)); 

     cout << result << endl; 
    } 
} 
+0

@Charles:我認爲,這不是重複的。 'cout'情況下的順序是明確的! – Nawaz 2011-02-25 10:07:58

+0

@Nawaz:這是完全一樣的問題。 '+'的關聯性也是明確的。 – 2011-02-25 10:24:19

+0

@Nawaz評估的順序在'cout'的情況下也沒有很好的定義。 – 2011-02-25 10:24:37

回答

4
int result = (Func2(i) + Func1(i) + Func1(i) + Func2(i)); 

中,這些函數的調用順序是由語言不明!

的段$ 5/4從C++標準(2003)讀出,

除非另有說明,操作數 評估順序個別 運營商和 單個表達式的子表達式,和的其中發生副作用的訂單 ,是 未指定

所以免費的建議是:避免寫這樣的代碼。他們不可攜帶!

+0

「結果是可預測的」是什麼意思? – user963241 2011-02-25 10:08:43

+0

@cpx:看到函數定義,你可以計算出這個值! – Nawaz 2011-02-25 10:09:41

+0

但是,如果它們按不同的順序調用,結果將不會相同。 – user963241 2011-02-25 10:11:09

0

如果您使用具有相同編譯選項的相同編譯器多次運行代碼,結果很可能是相同的。但是,如果更改選項或嘗試其他編譯器,則可能會得到不同的結果。

由於您只能在整數上使用簡單函數,因此以不同的順序調用函數並不會有太多好處,因此從左到右或從右到左都是明顯的選擇。而你的測試代碼無法區分差異! :-)