2013-08-02 41 views
-4

#define MIN (A,B) ((A)<(B)?(A):(B)) OR #define MIN (A,B) ((A < B)? A : B)定义宏C语言为MIN 2号

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

+0

请不要使用。不止一次评估参数的宏只是危险的。 Modern C具有类型的泛型表达式,可以帮助为作业选择正确的内联函数。 –

回答

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)) 
0

前者作为A或B可能是嵌套命令。考虑一下这两个宏将扩大此:

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

前者确实解决了嵌套问题,但由于双重评估仍然会陷入困境。考虑'int a = 10'的'int i = MIN(6,a ++)'的扩展。 – DUman

2

就个人而言,我不会要么使用,因为像MIN(++a, ++b)表达式可以拧你了(由于双评价)。

+0

你能否详细说明为什么这是一个问题。 –

+1

这是未定义的行为,像'a ++ hetepeperfan

+0

a ++

2

我个人的偏好是:

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

这样更安全,不需要额外的括号,并且如果你做类似的事情不会“炸毁”:

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

实际上,有人会使用min(x ++,y ++)吗?即使日常工作正常,这似乎是一个非常糟糕的编码决定。 – Jiminion

+0

是的,但是你可能想要'while(* ptr)lowest = min(* ptr ++,lowest);'或者类似的东西 - 如果它是一个宏,它也会表现奇怪。 –