zoukankan      html  css  js  c++  java
  • 强大的宏定义

    hhhh,关于宏定义,现在就给大家普及一部分

    最基本的定义常量

    #define  PI  3.1415926

    这种方式相信大家一定都知道吧

    但如果是关于可变参数的呢

    !!!第一种

    1 #include<stdio.h>
    2 
    3 #define OJBK(s) #s     //#表示将s转化为字符,也可以放字符串,s也可以用其他字符或字符串 
    4 
    5 int main()
    6 { 
    7     printf(OJBK(Hello World!   %d),999);//括号里面的空格会被看成一个, 
    8     return 0;
    9  } 

    现在大家一定会因为这个printf根本没打引号而感到奇怪吧。

    现在我就给你们解释一下。

    先说引号吧,根据我自己的理解,引号就是将一串字母数字符号转换为字符的工具

    所以加引号就是为了转换为字符,而我们的‘#’却可以完成这项操作。所以没有引号我们也可以正常的运行

    而OJBK()后面的就是普通操作

    !!!第二种

     #include<stdio.h>
     #define OJBK(...)  printf(# __VA_ARGS__)  //其中的...表示可变参数,而__VA_GARS__在处理中被实际参数所替换,这都是不能改变的。然后具体作用就自己敲一个来看效果吧。
     int main()
     {
         OJBK(Hello,    World!);
         return 0;
     }

    接下来我们来说说第三种‘##’

     #include<stdio.h>
     #define OJBK(x,y)  x  ##  y  //##的作用就是将两个连接起来,不过目前来说好像只发现可以连接数字
    int main()
    {
        printf("%d",OJBK(5,20));  //输出当然就是520啦
        return 0;
    }

    然后还有最后一种

    #include<stdio.h>
    #define OJBK(format,...) printf(#format,## __VA_ARGS__)  //format是可以修改的,表示你想要转换成字符的一串而逗号为分隔,#不对逗号以后的起作用,所以逗号后面的不是字符
    int main()
    {
        OJBK(Hello  World!
    %d%s,520," Iwpml-595");如果想输出%s的字符串就必须加引号,如果是数字就可以直接写数字,但前面一定要有%s%d之类的
        return 0;
    }

    剩下的就是宏定义替换的骚操作了

    比如说#define  hhh  scanf //这就表示hhh是scanf的同义词,能用scanf 的地方一般hhh也可以

    还有很多关于宏定义的骚操作,我就不细说了,剩下的就靠你们自己去探索吧!

  • 相关阅读:
    Luogu P4002 [清华集训2017]生成树计数
    Luogu P3978 [TJOI2015]概率论
    Codechef JADUGAR2 Chef and Same Old Recurrence 2
    Codechef TREDEG Trees and Degrees
    一些有趣的数
    有向图上Euler回路计数
    P5105 不强制在线的动态快速排序
    二分图小结
    BZOJ2648: SJY摆棋子
    P3231 [HNOI2013]消毒
  • 原文地址:https://www.cnblogs.com/Iwpml-595/p/9979758.html
Copyright © 2011-2022 走看看