zoukankan      html  css  js  c++  java
  • 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
    ",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的误操作。

  • 相关阅读:
    C#托盘图标
    线程相关整理
    Quartz.NET 快速入门
    (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
    美化console.log的文本(转载)
    mongoDB学习资料整理
    EF7学习资料整理
    Oracle常用
    Node.js学习资料整理
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器(转)
  • 原文地址:https://www.cnblogs.com/qoshi/p/3344925.html
Copyright © 2011-2022 走看看