现在的位置: 首页 > 综合 > 正文

杂七杂八 – 关于宏定义

2019年02月19日 ⁄ 综合 ⁄ 共 1076字 ⁄ 字号 评论关闭

    先来看一个题好了、、(本文有些内容转自网络,具体原作者不详)

    看看会输出几?

#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) )

抱歉!评论已关闭.