寫在前面的話:最近看到一道關于帶參數的宏定義題目。網上答案雖多,但卻千篇一律,并且有理解偏頗。現在寫來提供需要的人閱讀。
題目:
#include <stdio.h>
#define SQUAKE(a)((a)*(a))
int main(int argc, const char * argv[]) {
int a=5;
int b;
b = SQUAKE(a++);
printf("=======:%d\n",b);
return 0;
}
// b=25 b=30
#include <stdio.h>
#define SQUAKE(a)((a)*(a))
int main(int argc, const char * argv[]) {
int a=5;
int b;
b = SQUAKE(++a);
printf("=======:%d\n",b);
return 0;
}
// b=42 b=49
A1C1CDF0-579E-4156-B946-8BB98BE60B8E.png
注意:前方高能
b = SQUAKE(a++);
就等于
b=(a++)(a++)
遞增了兩次。
由于標準并未對這類運算規定順序以下結果都有可能
(a++)(a++)=56=25
(a++)(a++)=5*6=30
b = SQUAKE(++a);
就等于
b=(++a)(++a)
遞增了兩次,一次在乘法之前,一次在乘法之后。
(a++)(a++)=67=42
(a++)(a++)=7*7=49
9AF666F2-E562-4228-9B13-35D8B015885C.png
如果還是不太清楚,參考《C Primer Plus++》第527頁