0%

Max Function(C)

C语言使用宏定义取最大值

使用宏定义取两个值中最大值是一个很简单的题目,随手写下:

1
#define MAX(x,y) ((x)>(y)?(x):(y))

这样写可以应付大多数的情况了,但在某些情况下还是会出现问题,比如说:

1
2
3
4
5
6
7
#include<stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main(){
int i=4;
int j=5;
printf("max=%d,i=%d,j=%d",MAX(i++,j++),i,j);
}

输出的结果是:

1
max=6,i=5,j=7

这和我们想象的不太一样,j的值应该是6。我们把MAX(i++,j++)带入看下

1
printf("max=%d,i=%d,j=%d",((i++)>(j++)?(i++):(j++)),i,j);

我们可以看到,j++这条命令被执行了两次,导致j的值为7,为了解决这个问题,我们修改下MAX。

1
2
3
4
5
#define MAX(x,y) ({\
typeof(x) _x=x;\
typeof(y) _y=y;\
_x>_y?_x:_y;\
})

typeof获取x,y的数据类型,用_x和_y暂时保存x,y的值。避免了上面出现的问题。又或者是:

1
2
3
4
5
6
#define MAX(x,y) ({\
typeof(x) _x=x;\
typeof(y) _y=y;\
(void)(&_x==&_y);\
_x>_y?_x:_y;\
})

抛出Warning解决类型不同的问题(不是很理解这句话(void)(&_x==&_y);)。

比较相同类型的值时,也可以这样写(虽然我感觉没有上面的好用):

1
2
3
4
5
#define MAX(type,x,y) ({\
type _x=x;\
type _y=y;\
_x>_y?_x:_y;\
})

大概就是这样,关于宏定义取最大值的问题,欢迎与我讨论