C语言基础:C语言宏定义(2) - 带参数的宏定义

上一节课, 我们讲解了不带参数的宏定义, 这节课我们就来讲讲带参数的宏定义又是怎么定义, 使用和注意事项~~


下面我们来看一个例子:

#include <stdio.h>

#define kSum(a, b) a+b

int main()
{
    int a = 10;
    
    int b = 20;
    
    int c = kSum(a, b);
    
    printf("c = %d\n", c);
    
    return 0;
}

输出结果:



这样子我们就可以实现一个简单的加法运算啦~





但是这样子存在一个问题, 下面我继续看例子:

#include <stdio.h>

#define kSum(a, b) a+b

int main()
{
    int a = 10;
    
    int b = 20;
    
    int c = kSum(a, b) * kSum(a, b);
    
    printf("c = %d\n", c);
    
    return 0;
}

输出的结果:



按照我们的常理来说, 这个结果显然不是我们要的结果, 那为什么会输出这个结果呢?? 我们来分析一下, 看下面的例子:

    //#define kSum(a, b) a+b
    //其实这种写法, 只是简单的替换, 看下面:
    //kSum 10 + 20 * 10 + 20;
    int c = kSum(a, b) * kSum(a, b);

所以输出的结果是: 230





那样子我们又怎么解决问题呢? 下面继续看例子:

#include <stdio.h>

#define kSum(a, b) (a+b)

int main()
{
    int a = 10;
    
    int b = 20;
    
    int c = kSum(a, b) * kSum(a, b);
    
    printf("c = %d\n", c);
    
    return 0;
}

输出的结果:






这样子就可以解决简单的问题, 但问题又来了, 其实这样子写宏定义还是有问题的, 我们继续来看:

#include <stdio.h>

#define kPingfang(a) (a*a)

int main()
{   
    int c = kPingfang(2+2)/kPingfang(2);
    
    printf("c = %d\n", c);
    
    return 0;
}

输出的结果:



有人肯定有疑问的说, 结果不对啊, 为什么会是2呢??


我们继续分析:

    //#define kPingfang(a) (a*a)
    //kPingfang (2+2 * 2+2) / (2 * 2)
    int c = kPingfang(2+2)/kPingfang(2);

刚刚我们说了, 那个宏定义只是简单的替换, 所以显示的运算和上面的例子一样, 所以我们得出来的结果是: 8 / 4 = 2;




那我们要怎么解决呢?? 继续看下面的例子:

#include <stdio.h>

#define kPingfang(a) ((a) * (a))

int main()
{
    //#define kPingfang(a) (a*a)
    //kPingfang ((2+2) * (2+2)) / (2 * 2)
    int c = kPingfang(2+2)/kPingfang(2);
    
    printf("c = %d\n", c);
    
    return 0;
}

输出的结果:



只有这样子书写, 才是完全正确的, 一个有经验的程序员也是这么写的, 因为这样子写才够严谨.


说到这里, 或许有人会问, 函数不也是可以这样子调用吗, 那么宏定义和函数, 哪个效率比较高呢?

非要比较的话, 是宏定义的效率最高, 因为函数还需要进去里面调用, 而宏定义在编译之前就已经预处理完毕了, 所以宏定义的效率更高.





好了, 这次我们讲到这里, 下次我们继续~~~

posted @ 2015-01-10 20:14  背着吉他去流浪  阅读(349)  评论(0编辑  收藏  举报