一个比较大小的函数

去年面试的时候遇到了连续两次遇到这个问题,定义一个宏定义,返回最大的值。呵呵,当时一口气写下下面这个函数,感觉很不错了。自我感觉良好,感觉是书本上的,就是这个标准答案!

#define MAX(A,B) ((A)> (B)?(A):(B) )

在开发过程中遇到了一个比较问题,结果就给悲剧了。

这个问题主要是如果碰上a++这样的表达式,那么这个比较就会出现副作用,它会在比较处展开。(a++) > (B)?(a++):(B);比较的结果就有可能不是我们预期的结果,而且对a的值也产生了错误。

正确的写法:

#define max(x, y) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
(void) (&_max1 == &_max2); \
_max1 > _max2 ? _max1 : _max2; })

typeof的参数可以是两种形式:表达式类型

下面是使用表达式的的例子:
    typeof(x[0](1)
这里假设x是一个函数指针数组,这样就可以得到这个函数返回值的类型了。
如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。
以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。
   extern int foo();
   typeof(foo()) var;

下面是用类型作参数的例子:
   typeof(int *) a,b;
等价于:
   int *a,*b;

下面是两个等效声明,用于声明int类型的变量a。
   typeof(int) a; /*int类型*/
   typeof('b') a; /* GCC中这个表达式的类型是int(自动提升为int),
                  注意typeof(char)和typeof('b')得到的不是一样的,这个用sizeof可以看出来*/

(void) (&_max1 == &_max2); 在编译的时候,如果两个不同类型的指针做比较,编译器会发出警告!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值