前言
之前笔试过程中,我自认为使用宏来求得最值这方面已经了解的足够清楚。我一直是使用下面两个宏来做题的。直到我最近闲暇下来,阅读了《嵌入式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