C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
当前回答
旧的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会用到这些运算符,因为我认为这些运算符很有天赋。
其他回答
最简单的方法是将它定义为.h文件中的一个全局函数,如果您的程序是包含大量文件的模块化程序,则可以随时调用它。如果不是,double MIN(a,b){return (a<b?a:b)}是最简单的方法。
如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
值得指出的是,如果你用三元运算来定义最小值和最大值,比如
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
然后,为了在fmin(-0.0,0.0)和fmax(-0.0,0.0)的特殊情况下获得相同的结果,您需要交换参数
fmax(a,b) = MAX(a,b)
fmin(a,b) = MIN(b,a)
它也在GNU libc (Linux)和FreeBSD版本的sys/param.h中提供,并具有dreamlax提供的定义。
在Debian上:
$ uname -sr
Linux 2.6.11
$ cat /etc/debian_version
5.0.2
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
$ head -n 2 /usr/include/sys/param.h | grep GNU
This file is part of the GNU C Library.
在FreeBSD上:
$ uname -sr
FreeBSD 5.5-STABLE
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
源存储库在这里:
GNU C库 FreeBSD
旧的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会用到这些运算符,因为我认为这些运算符很有天赋。