C语言中的MIN和MAX定义在哪里?

实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)


当前回答

如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。

http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

其他回答

我知道那家伙说"C"… 但如果有机会,请使用c++模板:

template<class T> T min(T a, T b) { return a < b ? a : b; }

类型安全,其他注释中提到的++没有问题。

旧的GCC扩展:操作符<?, > ?, < ?=, > ?=

在非常旧的GCC版本中,有操作符<?, > ?(看这里,它是在c++中,但我认为它当时也适用于C扩展) 我还见过操作符<?=, > ?=对应于赋值语句。

操作数只计算一次,甚至允许使用非常短的赋值语句。与常见的最小/最大赋值相比,它非常短。没有什么比这更好的了。

这些是以下内容的简写:

min(a, b)   ===   a < b ? a : b   ===   a <? b;
max(a, b)   ===   a > b ? a : b   ===   a >? b;
a = min(a, b);   ===   if(b < a) a = b;   ===   a <?= b;
a = max(a, b);   ===   if(b > a) a = b;   ===   a >?= b;

求最小值非常简洁:

int find_min(const int* ints, int num_ints)
{
    assert(num_ints > 0);
    int min = ints[0];
    for(int i = 1; i < num_ints; ++i)
        min <?= ints[i];
    return min;
}

我希望有一天GCC会用到这些运算符,因为我认为这些运算符很有天赋。

在c++中有std::min和std::max,但是在C标准库中没有等价的。你可以自己用宏来定义它们

#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

但是,如果您编写MAX(++a, ++b)这样的代码,就会出现问题。

这是一个较晚的答案,由于最近的发展。由于OP接受了依赖于不可移植的GCC(和clang)扩展类型的答案-或“干净”ISO C的__typeof__ -在GCC -4.9有一个更好的解决方案。

#define max(x,y) ( \
    { __auto_type __x = (x); __auto_type __y = (y); \
      __x > __y ? __x : __y; })

这个扩展的明显好处是每个宏参数只展开一次,不像__typeof__解决方案。

__auto_type是c++ 11的auto. type的有限形式。它不能(或不应该?)在c++代码中使用,尽管在使用c++ 11时没有很好的理由不使用auto的高级类型推断功能。

也就是说,我假设当宏包含在extern“C”{…}范围;例如,来自C头文件。AFAIK,这个扩展没有找到它的方式信息叮当

最简单的方法是将它定义为.h文件中的一个全局函数,如果您的程序是包含大量文件的模块化程序,则可以随时调用它。如果不是,double MIN(a,b){return (a<b?a:b)}是最简单的方法。