2015-07-11 70 views
0

爲什麼輸出是「0 -6」而不是「4 60」?不是k = 8,l = 2?爲什麼分析代碼是不正確的?

#define MAC(a,b) (a<b ? a*b:a-b) 
void main (void) 
{ 
    int i=2; 
    int j=4; 
    int k=MAC(i,j); 
    int l=MAC(j,i); 
    i=MAC(k+l,k-l); 
    j=MAC(k-l,k+l); 
    printf("%d %d\n", i,j); 
} 
+8

每行之後都會打印語句。學習調試你自己的代碼=) – Mox

回答

4

一個直接的問題。表達

MAC(k+l,k-l) 

成爲

(k+l<k-l ? k+l*k-l:k+l-k-l) 
      ^^^^^^^ 

,正如你可以從下劃線位看,表達的是不是你認爲這是由於優先規則(乘法加法之前完成)。

這可以通過確保在宏每個參數是固定的parenthesised:

#define MAC(a,b) ((a)<(b) ? (a)*(b):(a)-(b)) 

但如果你像n++傳遞,因爲它會遞增多次仍然不會有所幫助。

宏是非常簡單的文本替換,並且衆所周知會導致問題,如您所看到的。我的建議是把MAC爲適當的功能,將完全避免這個問題,是這樣的:

int mac (int a, int b) { 
    if (a < b) 
     return a * b; 
    return a - b; 
} 
+0

...並且由於它很可能被編譯器內聯,所產生的代碼甚至可能幾乎相同。 –

3
#define MAC(a,b) (a<b ? a*b:a-b) 
void main (void) 
{ 
    int i=2; 
    int j=4; 
    int k= i<j ? i*j:i-j; 
    int l= j<i ? j*i:j-i; 
    i= k+l<k-l ? k+l*k-l:k+l-k-l; 
    j= k-l<k+l ? k-l*k+l:k-l-k+l; 
    printf("%d %d\n", i,j); 
} 

這是你的代碼得到預處理後所製作。預編譯宏在編譯之前發生。與編譯不同,不存在已發生變量的符號鏈接,但僅定義1到1的替換。

相關問題