我已經注意到使用預增加運算符時宏函數的這種奇怪的行爲。我知道這是不是最好使用預增運算符與宏,但我仍想知道以下兩個代碼的執行背後的原因: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。
如果有人能解釋爲什麼輸出是這樣的話,這將是一個很大的幫助?
未定義的行爲 – Danh
這不是一個很重複的http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior因爲OP可能會混淆宏是什麼(假設Sourav Ghosh的回答)。 –
嗨@Danh居然在我的一次考試中提出了這個問題,因此我認爲應該有一些方法來得到答案。 – user7297996