#define MIN (A,B) ((A)<(B)?(A):(B))
或#define MIN (A,B) ((A < B)? A : B )
请选择一个答案,为什么?!
答案 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);