特别“玄学”的define
前言
记得我上篇题解的代码注释里头有一个介绍么?
我今天就来讲玄学的define
关于define
什么是define
#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。
注意,#define
语句后不能加分号
为什么说define很玄学
我先给你看一段代码
#include<bits/stdc++.h>
#define US using
#define NS namespace
#define SD std
US NS SD;
int main()
{
return 0;
}
能不能运行呢?
答案是: 当然能了! \colorbox{grey}{\color{grey}\text{\Huge 当然能了!}} 当然能了!(刮刮乐)
这个玄学的define,将US
定义成了using
,将NS
定义成了namespace
,将SD
定义成了std
,所以语句US NS SD;
等价于using namespace std;
真的很玄学
define之妙用-1
大佬们经常做题时需要long long
,但是大佬们都太懒了,怎么办呢,C++为我们定义了一个关键字typedef
,什么意思呢,就是type define
那有人就会问了,这个typedef
和define
没有关系,那为什么要讲这个呢?
答案是,大佬们又发明出来了一种定义方法:
#define LL long long
这个等价于
typedef long long LL;
妈妈再也不用当心我考试写long long时间太长爆零了!
define之妙用-2
这个define
还能赋值。
比如我想定义一个模数 998244353 998244353 998244353,那么我们可以这样写:
const int Mod=998244353;
但是,我们也可以用define
来这么写:
#define Mod 998244353
const
有一个坏处就是你需要计算这个const
的玩意儿是什么数据的,不能是long long
的数据你给定义成const int
,也不能把double
的数据你给定义成short int
。
这时候,define就显示出它的作用了,你看上面的define
代码,你发现有定义关键字吗?
没有,所以,这个定义的关键字其实与它define
的数值有关。
哦,还有,在一些C++来计算 π \pi π或 e e e的情况中,我们可以先定义出来前几位,比如:
#define Pi 3.1415926535
define的妙用-3
大佬们最喜欢的就是#define ... for
了,这不,你瞧,上一个blog我就用了#define ... for
了,我并不是想说明我是大佬所以,如果你想秀一波,来学这个吧。
正向for
:
#define Fre(i,a,b) for(int i=a;i<=b;i++)
反向for
#define Fer(i,a,b) for(int i=a;i>=b;i--)
这些循环不仅写的方便,而且更不容易错了。
define的妙用-4
这个玄学define还能定义函数
我们就打个比方吧,假如我要定义一个a+b
的函数,则可以这样写:
inline int Add(int x,int y)
{
return x+y;
}
那么我们可以用define
来这样写:
#define Add(x,y) ((a)+(b))
同理,乘也可以这样写:
#define Mul(x,y) ((a)*(b))
define
真是神奇啊!
define的妙用-5
这个玄学define还能定义多行代码!
例如MFC中的宏定义
#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
} while(0) /* (no trailing ; ) */
最需要注意的是每个语句的后面要加上一个/
符。
结语
好了,define我就讲到这里了,下次将什么好呢?对了,九江ifdef
、undef
等等神奇的与define
的玄学搭配吧!