define是一个预处理命令,用于在编译时替换文本或定义新的标识符,相当于重新定义一个常量或语句。以下为常见几种用法:
1.定义常数
此时,0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff(32-bit int的最大值)一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出,0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
但是这种情况下使用const更好,因为const常量具有数据类型,define没有数据类型,且编译器可对const进行安全检查,而对define只进行字符替换,没有类型安全检查。
#include<iostream>
define n 0x3f3f3f3f
2.定义标识符和关键字
将long long替换成LL
#include <iostream>
#define LL long long
using namespace std;
int main()
{
LL a;
}
3.定义函数
此时get-max(a,b) 就可以得到a和比中较大的数。
#include <iostream>
#define get-max(a,b) (a>b)?(a:b)
但是,需要慎重使用,比如以下这种情况:
#include <iostream>
using namespace std;
#define add(a,b) a+b
int main()
{
cout << add(1,2)*3;
}
这种情况的预期输出是“出人意料”,很多人会以为是9,实际上是7
等效于以下这种情况:
#include <iostream>
using namespace std;
int main()
{
cout << 1+2*3;
}