zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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
    ", c);
        
        return 0;
    }

    输出的结果:






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

    #include <stdio.h>
    
    #define kPingfang(a) (a*a)
    
    int main()
    {   
        int c = kPingfang(2+2)/kPingfang(2);
        
        printf("c = %d
    ", 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
    ", c);
        
        return 0;
    }
    

    输出的结果:



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


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

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





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

  • 相关阅读:
    Java核心类库——线程Thread
    xml基本写法和dtd schema的用法,JAVA读写XML
    Java核心类库——文件和文件夹的管理File类
    使用文件依赖项缓存页输出
    根据 HTTP 标头缓存页的版本
    缓存 ASP.NET 页的某些部分
    根据请求浏览器缓存页的版本
    根据自定义字符串缓存页的版本
    缓存页的多个版本
    阿拉的宣告~~~
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282876.html
Copyright © 2011-2022 走看看