#define MIN (A,B) ((A)<(B)?(A):(B))
OR #define MIN (A,B) ((A < B)? A : B)
定义宏C语言为MIN 2号
的请选择一个答案,为什么?!
#define MIN (A,B) ((A)<(B)?(A):(B))
OR #define MIN (A,B) ((A < B)? A : B)
定义宏C语言为MIN 2号
的请选择一个答案,为什么?!
让我们有这样的表达:
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))
前者作为A或B可能是嵌套命令。考虑一下这两个宏将扩大此:
int i = MIN(3+1,2);
前者确实解决了嵌套问题,但由于双重评估仍然会陷入困境。考虑'int a = 10'的'int i = MIN(6,a ++)'的扩展。 – DUman
就个人而言,我不会要么使用,因为像MIN(++a, ++b)
表达式可以拧你了(由于双评价)。
我个人的偏好是:
inline int min(int a, int b)
{
return (a > b)?b:a;
}
这样更安全,不需要额外的括号,并且如果你做类似的事情不会“炸毁”:
x = min(x++, y++);
实际上,有人会使用min(x ++,y ++)吗?即使日常工作正常,这似乎是一个非常糟糕的编码决定。 – Jiminion
是的,但是你可能想要'while(* ptr)lowest = min(* ptr ++,lowest);'或者类似的东西 - 如果它是一个宏,它也会表现奇怪。 –
请不要使用。不止一次评估参数的宏只是危险的。 Modern C具有类型的泛型表达式,可以帮助为作业选择正确的内联函数。 –