define 宏定义

宏定义的三种用法

一、定义一个变量

在学习宏定义之前我们定义一个变量是这样的

#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

所以我们在使用宏定义的时候一定要注意优先级的问题

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值