先来看一个题好了、、(本文有些内容转自网络,具体原作者不详)
看看会输出几?
#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);
}
----------------------------------------------------------------------------------------------------------------------------------------------------
如果答案是 5 呢,就直接左(右)上角。
这是今天以为学弟问我的,我的第一反应就是 100,可这是错的 - -#
那我们来看一看什么是宏定义吧
当我们在一个集成的开发环境中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程。预处理器将源程序文件中出现的对宏的引用展开成相应的宏 定义,即本文所说的#define的功能,由预处理器来完成。 经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,所以在学习#define命令时只要能真正理解这一点,这样才不会对此命令引起误解并误用。
在该样例中,宏展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏MINN出现的地方 只是简单地使用串
(x)<(y)?(x):(y)
来代替MIN,并不会增添任何的符号。
所以就相当于:
#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); // 10 * i < j ? i : j -----> 100 < 15 : 10 ? 15 返回15
printf("%d\n",k);
}
相信你一定明白了吧,我再给出两个例子
#include <stdio.h>
#define area(x) x*x
int main()
{
int a = area(2 + 2) / area(2 + 2);
int b = area(2 + 2);
printf("%d %d\n",a, b);
return 0;
}
答案是 13 8 你对了嘛、、
小结: 宏定义很好用,但是定义小函数的时候,能加多少括号就加多少!!
#define area(x) ( (x) * (x) )