在C中为MIN定义2个数字

时间:2013-08-02 13:19:57

标签: c macros c-preprocessor

#define MIN (A,B) ((A)<(B)?(A):(B))#define MIN (A,B) ((A < B)? A : B )

请选择一个答案,为什么?!

4 个答案:

答案 0 :(得分:6)

让我们有这样的表达:

int c = MIN(x == y, 1);

让我们试试#define MIN (A,B) ((A < B) ? A : B )

在C中,==运算符的优先级低于<(因此x == y < z等同于x == (y < z)),因此它将成为

int c = MIN (x == (y < 1) ? x == y : 1)

如果你使用第二个表达式......那就错了,所以第一个表单更好。

让我们试试#define MIN (A,B) ((A) < (B) ? (A) : (B))只是为了确保......

这里我们有

int c = MIN ((x == y) < (1) ? (x == y) : (1))
好多了!

最后他们都“不好”,因为

int c = MIN(++x, 1);

++x评估两次(一次在<比较中,一次由三元运算符“选中”作为结果)

int c = MIN ((++x) < (1) ? (++x) : (1))

答案 1 :(得分:2)

就个人而言,我也不会使用,因为像MIN(++a, ++b)这样的表达式可能会让你失望(由于双重评估)。

答案 2 :(得分:2)

我个人的偏好是:

inline int min(int a, int b) 
{
   return (a > b)?b:a;
}

这样更安全,不需要额外的括号,如果您执行以下操作,则不会“爆炸”:

x = min(x++, y++); 

答案 3 :(得分:0)

前者,因为A或B可以是嵌套命令。考虑两个宏如何扩展它:

int i = MIN(3+1,2);