编译预处理(宏定义练兵场)

来源:互联网 发布:电脑开热点软件 编辑:程序博客网 时间:2024/05/21 01:55

上个月写了一篇有关编译预处理内容的博客,其中介绍到了宏定义,并且举了几个简单的例子说明了一下,宏定义是如何“忠实”展开的。最近碰到了一个问题,发现对宏定义“忠实”展开还是没有深刻了解,下面把这道题记录下来:

#include<stdio.h>#define MIN(x,y) (x)<(y)?(x):(y)int main(){   int i,j,k;   i=10;   j=15;   k=10*MIN(i,j);   printf("%d\n",k);   return 0;}

上述代码输出结果为?
【典型错误】刚开始拿到这道题还是下意识的以函数的思维去理解了,把i,j两个变量传给MIN(x,y),然后做其后面的运算,并将结果返回到主函数中,最后得到k=10*10,输出结果是100。
【正确思路】一定牢记“忠实”展开,这个忠实的过程是指:k=10*(x)<(y)?(x):(y),即将MIN(i,j),直接替换为MIN(x,y)后面的字符,这里面的x对应于i,y对应于j。那么k=10*10<15?10:15,即k=100<15?10:15所以最后输出的结果为15。

原创粉丝点击