今天从香山上面回来累的跟傻逼一样,回来问了一下胡总的阿里面试的问题。然后其中有一个是宏写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 ",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的误操作。