2016-12-14 105 views
0

我已經注意到使用預增加運算符時宏函數的這種奇怪的行爲。我知道這是不是最好使用預增運算符與宏,但我仍想知道以下兩個代碼的執行背後的原因:C中的宏和前/後增量

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int b=SQR(a++); 
    int c=SQR(++a); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

的這個輸出是:

20.....64....10240 

第一個值b是20,這是可以的4 * 5。但爲什麼C的值是64即8 * 8而不是7 * 8?

我剛剛更換執行這樣的順序:

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int c=SQR(++a); 
    int b=SQR(a++); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

的這個輸出是:

42.....36....12096 

奇怪是不是?預增量有一些問題。它給出42即6×7而不是5×6,並且之後後增量也給出錯誤答案36,即6×6而不是6×7。

如果有人能解釋爲什麼輸出是這樣的話,這將是一個很大的幫助?

+0

未定義的行爲 – Danh

+0

這不是一個很重複的http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior因爲OP可能會混淆宏是什麼(假設Sourav Ghosh的回答)。 –

+0

嗨@Danh居然在我的一次考試中提出了這個問題,因此我認爲應該有一些方法來得到答案。 – user7297996

回答

2

宏是文本替換,因此您的代碼

SQR(a++) 

擴展到像

a++ * a++ 

,並int c=SQR(++a);int c = ++a*++a;

它調用undefined behavior。爲了詳細說明爲什麼這部分,請參考這個寫得很好的答案。

+0

是否有任何方法得到至少第一個功能的答案,因爲這是我在我的一個考試中得到 – user7297996

+1

@ user7297996 nopes,UB是... UB。而已。 –

+0

好的,謝謝你的幫助 – user7297996