UID 1
精华
积分 76361
威望 点
宅币 个
贡献 次
宅之契约 份
最后登录 1970-1-1
在线时间 小时
#define min(x,y) ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; })
#define max(x,y) ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x > _y ? _x : _y; })
这两个定义中出现了一句(void)(&_x == &_y),这是什么意思呢?
首先(&_x == &_y)的作用是:在计算两个数的最小值之前,去判断一下两个值的类型是否一致。而由于C语言本身不支持我们去做类似于这样的操作typeof(_x)==typeof(_y),所以在此,通过故意判断他们2个的地址指针是否相等,而显然&_x,即x的地址,是不可能等于&_y的,但是这句话(&_x == &_y);使得,如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,则会引起编译器产生一个编译警告,提示你这两个值的类型不同。
但是这样也会让GCC输出另一条警告:warning: statement with no effect. 也就是“警告:表达式没有任何效果。”但是我们又不想看到这条无用的警告,因此在(&_x == &_y)这个表达式的左边加一个(void),意为告诉编译器“即使它没用我也要这么写。”这样编译器就不会提示了。真是个巧妙的设计呢!
参考资料:
http://www.crifan.com/order_min_ ... __y_the_meaning_of/