#define MIN (A,B) ((A)<(B)?(A):(B))
或者#define MIN (A,B) ((A < B)? A : B )
请选择一个答案,为什么?!
#define MIN (A,B) ((A)<(B)?(A):(B))
或者#define MIN (A,B) ((A < B)? A : B )
请选择一个答案,为什么?!
让我们有这个表达式:
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))
就个人而言,我不会使用任何一个,因为像这样的表达式MIN(++a, ++b)
可能会让你搞砸(由于双重评估)。
我个人的偏好是:
inline int min(int a, int b)
{
return (a > b)?b:a;
}
这更安全,不需要额外的括号,并且如果您执行以下操作也不会“爆炸”:
x = min(x++, y++);
前者,因为 A 或 B 可以是嵌套命令。考虑这两个宏将如何扩展它:
int i = MIN(3+1,2);