2015-11-01 65 views
-2

下面的代碼應該返回值216,但它返回392是(7 * 7 * 8)。有人可以請我解釋一下嗎?C++/g ++宏異常

#include<iostream> 
#define cube(x) (x*x*x) 
    using namespace std; 

    int main() 
    { 
     int x=5; 
     cout<<cube(++x); 
     cout<<endl; 
     return 0; 
     } 

回答

2

宏展開後,您將獲得:

using namespace std; 

int main() 
{ 
    int x=5; 
    cout<<(++x*++x*++x); 
    cout<<endl; 
    return 0; 
    } 

,這是不確定的行爲。

只需用一個函數代替cube宏:

int cube(int x) { 
    return x * x * x; 
} 
+0

感謝您的建議。我沒有試圖用這個解決問題。我只是對這種行爲感到好奇。事情是如果x被替換爲x ++那麼它不應該是7 * 8 * 9? – xeon

+1

@xeon這是未定義行爲的一部分。你不能指望這個程序有任何特別的結果。 – juanchopanza

2

你真的應該使用一個功能,而不是一個宏。 cube(++x)擴大爲

++x*++x*++x 

這根本不是我們想要的。

+0

感謝烏拉圭回合的建議。我沒有試圖用這個解決問題。我只是對這種行爲感到好奇。事情是如果x被替換爲x ++那麼它不應該是7 * 8 * 9? – xeon

+0

它可能是*任何*結果。您不允許在表達式中多次更改變量的值。如果你這樣做,就像這裏一樣,語言標準沒有說明會發生什麼。所以我們不知道。 –