-4

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

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

4

4 回答 4

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))
于 2013-08-02T13:24:12.913 回答
2

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

于 2013-08-02T13:22:42.687 回答
2

我个人的偏好是:

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

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

x = min(x++, y++); 
于 2013-08-02T13:29:22.813 回答
0

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

int i = MIN(3+1,2);
于 2013-08-02T13:22:15.600 回答