爲什麼輸出是「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);
}
爲什麼輸出是「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);
}
一個直接的問題。表達
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;
}
...並且由於它很可能被編譯器內聯,所產生的代碼甚至可能幾乎相同。 –
#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的替換。
每行之後都會打印語句。學習調試你自己的代碼=) – Mox