#define的小trick
程序员文章站
2022-03-15 22:33:41
...
请看下面这段代码:
#include<stdio.h>
#define SQR(x) x*x
int main()
{
int a;
int k=3;
a=++SQR(k+1);
printf("%d",a);
}
大家觉得结果应该是多少呢?
如果不用编辑器编译运行的话,我相信大家会给出各种不同的答案。
最常见的错误就是先算k+1=4,然后就是4*4+1=17,这个结果看似很对,但却忽略了一个地方,就是#define只做替换不做运算。所以不能先算括号里的k+1,。
那么现在这种答案被否定后,又出现了另外一种答案:
3+1*3+1=7,最后++再加1,所以结果等于8,这个看似很合理,而且离正确的答案已经非常地接近,只差了一步就对了,那么它的问题又出现在哪呢?
其实它这样算还是没有理解#define只做替换不做运算,人为地在++后面给它加了括号,就相当于++(k+1*k+1)。
正确的理解应该是这样的:
++k+1*k+1,这样看的话就对了,由于++运算符的优先级高于+,所以先算++k,k就等于4了,后面的k这时也是4,所以结果就是4+4+1=9。
这是个比较经典的题目,大家能把这题理解的话对于#define应该是没问题了。