C语言中,定义宏求两个数的最大值\最小值

前言

        之前笔试过程中,我自认为使用宏来求得最值这方面已经了解的足够清楚。我一直是使用下面两个宏来做题的。直到我最近闲暇下来,阅读了《嵌入式C语言自我修养》这本书,才发现自己很多情形没有考虑到位。

#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))

一、同类型的变量,如果出现对参数自增自减操作,该如何修改

如果按照前言的版本,显然在下面的情况是无法正常运行的

#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void)
{
    int i = 2;
    int j = 6;
    printf("max=%d",MAX(i++,j++));  //此处运行后i=4,j=7;且max=7;
    return 0;
}

        该测试代码期待的运行结果是,i、j两个变量进行对比,max存储i、j未自增前的最大值,而经过MAX宏运算后,i、j各自自增1,即期待的运行后结果为max = 6, i = 3,j=7。

        与期待的结果不同,实际运行的结果为max = 7, i =4 ,j=7。

        为什么会出现这个状况呢,显然是进行宏替换时,将自增运算符也替换了,如下面代码所示。

#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void)
{
    int i = 2;
    int j = 6;
    //printf("max=%d",MAX
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值