C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
当前回答
如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
其他回答
如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
我编写的这个版本适用于MSVC、GCC、C和c++。
#if defined(__cplusplus) && !defined(__GNUC__)
# include <algorithm>
# define MIN std::min
# define MAX std::max
//# define TMIN(T, a, b) std::min<T>(a, b)
//# define TMAX(T, a, b) std::max<T>(a, b)
#else
# define _CHOOSE2(binoper, lexpr, lvar, rexpr, rvar) \
({ \
decltype(lexpr) lvar = (lexpr); \
decltype(rexpr) rvar = (rexpr); \
lvar binoper rvar ? lvar : rvar; \
})
# define _CHOOSE_VAR2(prefix, unique) prefix##unique
# define _CHOOSE_VAR(prefix, unique) _CHOOSE_VAR2(prefix, unique)
# define _CHOOSE(binoper, lexpr, rexpr) \
_CHOOSE2( \
binoper, \
lexpr, _CHOOSE_VAR(_left, __COUNTER__), \
rexpr, _CHOOSE_VAR(_right, __COUNTER__) \
)
# define MIN(a, b) _CHOOSE(<, a, b)
# define MAX(a, b) _CHOOSE(>, a, b)
#endif
C语言中的MIN和MAX定义在哪里?
他们不是。
实现这些的最好方法是什么,尽可能的泛型和类型安全(主流编译器的编译器扩展/内置首选)。
作为功能。我不会使用像#define MIN(X, Y) (((X) < (Y))这样的宏?(X):(Y)),特别是如果您计划部署您的代码。要么写你自己的,使用标准的fmax或fmin,或者在GCC语句表达式中使用GCC的typeof(你也会得到类型安全奖励)修复宏:
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
每个人都说“哦,我知道双重求值,这没问题”,几个月后,你会连续几个小时调试最愚蠢的问题。
注意使用__typeof__而不是typeof:
如果你正在写一个头文件 必须工作时,包括在ISO C 程序,写__typeof__而不是 typeof。
两个整数a和b的最大值是(int)(0.5((a+b)+abs(a-b)))。这也可以用于(double)和fabs(a-b)用于double(类似于float)
看起来像Windef.h (a la #include <windows.h>)有max和min宏(小写),这也遭受了“双重求值”的困难,但它们是为那些不想重新滚动自己的:)