代码之家  ›  专栏  ›  技术社区  ›  Sillyon

使用#在c中定义宏预处理器查找最小值(a、b、c)或最大值(a、b、c)

  •  1
  • Sillyon  · 技术社区  · 7 年前

    这是我考试中提出的问题:“用c语言编写带有宏的min(a,b,c)的cource代码。”

    #define min(a,b,c) ((a)<(b)?((a)<(c)?(a):(c)):((b)<(c)?(b):(c)))
    

    有没有更好的方法来解决最小/最大(x,y,z)问题?

    3 回复  |  直到 7 年前
        1
  •  3
  •   paxdiablo    7 年前

    您的解决方案以及所有基于可移植宏的解决方案都是尽可能限制宏使用的一个很好的理由。现在,我几乎只将它们用于条件编译。

    在定义常量方面,最好使用枚举。

    对于像宏这样的函数,最好使用可以建议编译器内联的函数,或者仅仅依靠编译器来解决这个问题(它们通常很擅长)。


    类似宏的函数是个坏主意的原因是,作为简单的文本替换,序列:

    #define mymax(a, b) (a) > (b) ? (a) : (b)
    int x = mymax(y++, complexFunction());
    

    将实际评估 y++ 和/或呼叫 complexFunction() 不止一次, 真正的函数不会做的事情。

    只要你了解这些限制,就一定要使用它们。我,我将依靠编译器为函数做正确的事情,这样我就不必太担心C的暗角:-)

        2
  •  2
  •   Dúthomhas Rishu    7 年前

    对写入函数。

    int min2( int x, int y        ) { return x < y ? x : y; }
    int min3( int x, int y, int z ) { return min2( x, min2( y, z ) ); }
    

    如果您希望美观,可以编写一些变量宏,根据参数的数量选择正确的函数。不过,这些都是很难写的。

    如果你想坚持 只有 宏,您的选择不太友好。 阿贾伊B -s解决方案(根据注释固定)运行良好。

    GCC支持一些 nice extensions 消除重新评估问题:

    #define max(a,b) \
       ({ typeof (a) _a = (a); \
           typeof (b) _b = (b); \
         _a > _b ? _a : _b; })
    

    然后,您可以轻松地编写任何不受插入式或重新评估恐惧影响的n元宏。

    #define max3(a,b,c) max(a,max(b,c))
    
        3
  •  1
  •   Ajay Brahmakshatriya    7 年前

    我认为你在问题中遗漏的关键点是“宏”,而不是宏。如果您将其进一步细分如下,则可以将其简化很多-

    #define min2(a, b) ((a) < (b) ? (a) : (b))
    #define min(a, b, c) (min2(min2((a), (b)), (c)))
    

    这也更容易理解。