写在前面的话:最近看到一道关于带参数的宏定义题目。网上答案虽多,但却千篇一律,并且有理解偏颇。现在写来提供需要的人阅读。
题目:
#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
注意:前方高能
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
如果还是不太清楚,参考《C Primer Plus++》第527页