c宏的MAX函数

今天从香山上面回来累的跟傻逼一样,回来问了一下胡总的阿里面试的问题。然后其中有一个是宏写max函数。胡总说不好写,然后我就去洗澡了。

 

洗澡的时候感觉不对啊,回来写了一个:

1 #define MAX(a,b) a>b?a:b;

测了一下可以。然后胡总说搞个++就不行了。然后有了如下代码:

1     int x = 5;
2     int y = 6;
3     scanf("%d%c",&x,&y);
4     printf("%d\n",MAX(x,y++));
5     printf("%d",y);

这里打印出来的是:

7

8

显然y++被执行了两次,宏跟函数的传递方式不一样,宏是以替换的形式,而函数是先求值再传参数。因此这里其实是执行了 x > (y++)?x:y++,显然y++执行了两次

之后网上搜了一下,又有了下面的版本:

1 #define max(x,y) ({typeof(x) _x = (x);typeof(y) _y = (y);(void)(&_x == &_y);_x > _y ? _x : _y; })

这里其实是声明了两个变量_x和_y然后进行比较。

其中关键的一句是(void)(&_x == &_y)。

这句话判断了_x和_y的类型是否相等。因为据说c语言不能直接判断typeof()是否相等。

然后这里是判断&x和&y是否相等,就是判断x和y的指针是否相等。在判断两个变量是否相等的时候,编译器会先判断两个变量的类型是否相等。如果x和y的类型不等,那么他们对应的指针类型自然不会相等(编译的时候会产生waring)。

前面的(void)的意义在于将判断两个指针是否相等的结果抛弃。不然据说会提示这段代码没用。

更加安全的办法,应该在typeof前面加一个const,这样会避免对_x和_y的误操作。

posted @ 2013-09-28 23:28  qoshi  阅读(615)  评论(0编辑  收藏  举报