#define定义宏函数 的正确使用

如何使用宏来定义一个自定义函数呢?
首先我们来看下面这段代码

#define SQUARE(x) x*x
int main()
{
	int a = 5;
	printf("SQUARE(a): %d\n",SQUARE(a));	//这个值为25
	printf("SQUARE(a+1): %d\n", SQUARE(a + 1));	//第一反应是打印36,其实打印的是11
}

运行结果:
在这里插入图片描述
为什么会出现这样的结果呢?原因是编译器在处理SQUARE(a+1)的时候,处理成了 a+1a+1 ,所以a = 5时,最后结果为 11,当我们的宏定义为 #define SQUARE(x) xx 时,结果就是36,那这种宏的定义方法是正确的吗?
再看看下面这段代码:

#define MAX(a,b) (a>b?a:b)
int main()
{
	int a = 5;
	int b = 3;
	printf("MAX(a, b): %d\n", MAX(a, b));		//很明显,打印的是5.
	printf("MAX(a&1, b&1): %d\n", MAX(a&1, b&));	//这里打印的是5吗?
}

运行结果如下:
在这里插入图片描述
那这又是怎么回事呢?原因是编译器将 MAX(a&1, b&1) 处理为 a&1>b&1?a&1:b&1 ,这里就要考虑运算符的优先级问题了。这篇博客介绍了C语言运算符优先级
所以我们可以看到>的优先级高于&,所以运算过程如下图:
在这里插入图片描述

总结:宏函数的正确写法是 每一个元素加括号,并且在最外层也加括号,如#define MAX(a,b) ((a)>(b)?(a):(b?).

仅为个人理解,如有错误请指出!

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值