#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const double eps = 1e-8; //const只是用来定义常量,常量在代码中一直存在,但define是预处理功能,有本质区别
const int maxx=0x7f7f7f7f;//0x7f7f7f7f表示数据的无穷大
//常用的浮点数比较宏定义:
#define Equ(a,b) ((fabs((a)-(b)))<(eps)) //等于
#define More(a,b) (((a)-(b))>(esp)) //大于
#define Less(a,b) (((a)-(b))<(-esp))//小于
#define MoreEqu(a,b) (((a)-(b))>(-esp))//大于等于
#define LessEqu(a,b) (((a)-(b))<(esp))//小于等于
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )//
//使用了algorithm头文件就可以直接使用max函数;
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
#define ll long long
#define PI 3.1415926
#define eps 1e-8
#define Conn(x,y) x##y
int main()
{
return 0;
}
宏定义很好用,很方便,但其中也有很大边界效应弊端:
例如
#define N 100
#define M 200 + N
当你在程序中使用 M*N 时,原本想要的应该是100 * (200+ N ),而实际上,编译器却给你变成了 100 * 200 + N,这就是所谓的边际效应,说白了,就是替换出现了错误。
为了避免错误:
1.求值宏要用括号括起来,避免产生二意。
2.对于带参数的宏,在宏体中引用宏参数时,最好也把参数用括号括起来,否则会产生歧义。
3.避免多次求值,应定义一个本地变量暂存所有会被引用多次的宏参数。
4.对于非求值的宏,即代码块宏,用do {…}while(0)包围代码块,防止产生意外代码。