0
#include <stdio.h> 
#define abs(x) x > 0 ? x : -x 

int main(void) { 
    printf("%d\n", abs(abs(3 - 5))); 
    return 0; 
} 

爲什麼上面的程序輸出8而不是2而下面的程序輸出2呢?爲什麼這個程序輸出8?

#include <stdio.h> 

int abs(int x) { 
    return x > 0 ? x : -x; 
} 

int main(void) { 
    printf("%d\n", abs(abs(3 - 5))); 
    return 0; 
} 
+2

更改'#define abs(x)x> 0? x:-x'到'#define abs(x)((x)> 0?(x): - (x))' – ouah

+0

程序[outputs negative 8](http://ideone.com/H434lj),不是8. – dasblinkenlight

+0

我最近注意到我發佈了代碼,如果表達式是'#define abs(x)(x> 0?x:-x)',那麼它會[輸出正八](http:// ideone.com/7WY5Ie),@dasblinkenlight,謝謝你的方式。 –

回答

2

簡答題是「因爲宏不是函數」。

龍的回答是,宏觀參數被擴展到程序的文本,所以C編譯器看到這漫長的表達:

3 - 5 > 0 ? 3 - 5 : -3 - 5 > 0 ? 3 - 5 > 0 ? 3 - 5 : -3 - 5 : -3 - 5 > 0 ? 3 - 5 : -3 - 5 

在擴展方面,負號適用於3,不(3-5),產生負8.

儘管您可以通過在宏定義中將x置於括號中來解決此問題,但定義內聯函數將是更好的選擇。