宏定义的三种用法
一、定义一个变量
在学习宏定义之前我们定义一个变量是这样的
#include <stdio.h>
int main(){
float PI = 3.1415926;
float r = 2;
float s = PI * r * r;
return 0;
}
在我们这个程序里面我们把PI定义为3.1415926,当我们合成一个工程时,PI在别人的程序里面可能就是3.14了,所以我们可以把常用的参数提出来放到一个文件或者放到一起,统一定义,当后续使用发现和别人的冲突时,我们仅仅需要修改一个参数就可以了,这个时候就用到了宏定义的定义变量。
像上面这个代码我们可以把PI定义为3.1415926,然后我们就不需要float PI = 3.1415926;了。
#include <stdio.h>
#define PI 3.1415926
int main(){
float r = 2;
float s = PI * r * r;
printf("%f\n",s)
return 0;
}
以后我们想用所有3.1415926的地方我们直接用PI就可以了
输出的结果是
这就是宏定义的第一种用法,定义一个变量。
二、定义一个运算符
我们定义一个 CH ,把他定义为* ,以后所有遇到*的地方我们都用CH 来代替
#include <stdio.h>
#define PI 3.1415926
#define CH *
int main(){
float r = 1.5;
float s = PI CH r CH r;
printf("%f\n",s);
return 0;
}
float s = PI CH r CH r; 的意思就是float s = PI * r * r;
输出的结果就是
这就是宏定义的第二种用法:定义一个运算符
三、定义一个公式
我们定义一个专门求圆的面积的公式
#define s(a,b) a*b*b
用a来定义PI,用b来定义r,那么圆的面积就是a*b*b,我们在用圆的面积的公式时直接调用s(a,b)这个公式就可以了
输出的结构如下
这就是宏定义的第三种用法:定义一个公式
define 宏定义的优先级
我们首先写一个比较a和b两个值谁大的函数,返回大的数。
#include <stdio.h>
int Max(int x, int y){
return (x>y?x:y);
}
int main(){
int Max(int x, int y)
int a = 10;
int b =20;
return 0;
}
int Max(int x, int y)就是我们的函数头,也叫做函数声明。一般来说函数的定义在main函数之前,就不需要声明。函数本身还有个类型检查的功能,用起来并不是很方便,当我们在上面的代码种输入一个float类型的变量,函数就会断,
用宏定义的方式来做完全替换不做检查,所以不是很安全,方便性和安全性不可兼得。
我们来用宏定义的方式来做替换
#include <stdio.h>
#define Max(x,y) (x>y)?x:y
int main(){
int a = 10;
int b =20;
printf("%d\n",Max(a,b));
return 0;
}
输出的结果是
那么不做检查会有什么隐藏的问题呢
我们先来定义一个变量c = Max(a,a+b);再来输出c,
那我们再来定义c = Max(a,a+b)*5;因为前面是30,30*5=150,输出的结果应该为150。我们来看一下
输出的结果为110。我们来分析一下 c = Max(a,a+b),c = Max(a,a+b) == 10>10+20?10:10+20
c = Max(a,a+b)*5 == 10>10+20?10:10+20*5,这时候我们会发现*的优先级比+高,所以会先执行20*5再执行+10。
那我们如何来避免他呢,只需要在宏定义上加()就可以了
#include <stdio.h>
#define Max(x,y) ((x>(y))?(x):(y))
int main(){
int a = 10;
int b =20;
int c = Max(a,a+b)*5;
//printf("%d\n",Max(a,b));
printf("%d\n",c);
return 0;
}
再输出一下,结果为150
((x>(y))?(x):(y)) == (10>10+20?10:10+20)*5
所以我们在使用宏定义的时候一定要注意优先级的问题