2010-07-12 79 views
1

我在網上瀏覽C++ FAQ Lite。我再次瀏覽內聯,因爲我沒有找到他們的用途,並想知道如何停止循環依賴如this答案中所示。我首先試圖做到「爲什麼內聯比定義更好」。例如用下面的代碼:定義不評估POD?

#define unsafe(i) \ 
    ((i) >= 0 ? (i) : -(i)) 

inline 
int safe(int i) 
{ 
    return i >= 0 ? i : -(i); 
} 

int f(); 

int main(void) 
{ 
    int x(5); 
    int ans; 

    ans = unsafe(x++); 
    cout << ans << endl; 
    ans = unsafe(++x); 
    cout << ans << endl; 

    ans = safe(x++); 
    cout << ans << endl; 
    ans = safe(++x); 
    cout << ans << endl; 

    std::cin.get(); 
    return 0; 
} 

編輯:

大。錯過了錯字。不是說我很苦,我沒有發現這樣的錯誤或任何東西。

輸出現在是6, 9, 9, 11

但是,即使預增量,第一個值不應該導致7?

如果宏被調用兩次,然後不它是這樣的:

不安全的(X)//前遞增調用時不會修改值。

unsafe(++ x)//對於所有意圖和目的,增量發生在第二次調用之前,所以++ x。如果被調用兩次,這是第一個ans = unsafe(x++)

當我們到達第二個ans = unsafe(++x)時,x不應該增加兩次嗎?一次通過雙重通話,一次當第一次雙重通話結束時?

+1

我不確定這是一個錯字,還是在實際的代碼中,但宏應該是'((i)> = 0?(i): - (i))'。 ('?'而不是'=') – 2010-07-12 13:01:06

+0

是的,是的。這是相當愚蠢的錯誤。 – IAE 2010-07-12 13:09:39

回答

3

相反的:

#define unsafe(i) \ 
    ((i) >= 0 = (i) : -(i)) 

我想你想:

#define unsafe(i) \ 
    ((i) >= 0 ? (i) : -(i)) 

在回答您的編輯:

第一次調用unsafe(x++)後,x是7,即使ans是6.這是因爲你有這樣的說法:

ans = ((x++) >= 0 ? (x++) : -(x++)) 

ans被分配給中間x++後最左邊的x++進行評價。因此,ans == 6但是x == 7。與unsafe(++x)的區別在於ans被分配給++x,這意味着結果爲ans == x == 9

+0

由於某種原因,我不得不盯着那30秒,直到我注意到這個差異。我詛咒你,三元'':'操作員! – 2010-07-12 13:01:45

+0

相同,但是當您注意到您剛剛在SO上暴露了您的拼寫錯誤時,這使得它更加令人不快:更新的問題! – IAE 2010-07-12 13:09:24

相關問題