这个MIN宏如何工作?
如果这是一个愚蠢的问题,请原谅我。 我似乎无法弄清楚以下MIN宏是如何工作的:
#define MIN(x, y) (y) ^ ((x ^ y) & -(x < y))
宏是一个预处理器指令,意味着无论在何处使用它,它都将被相关的代码段替换。
如果你在你的MIN
宏编辑,我或这里的其他人应该能够帮助解释它。
例:
#include #define PLUS + int main() { printf("%d", (1 PLUS 3)); }
这应该只输出4
。
编辑
让我们分解你的宏..
我们有,
(y) ^ ((x ^ y) & -(x < y))
-
我们来看最后一部分,
(x < y)
。 如果x
小于y
,则为1
否则为1
。 因此,如果x
小于0
,则-(x < y)
将为0xffffffff
。 -
所以现在,
((x ^ y) & -(x < y))
变为((x ^ y) & 0xffffffff)
,即(x ^ y)
,如果x小于y,则((x ^ y) & 0)
,即0
否则。 -
因此,如果x更小并且
(y) ^ 0
,即y
,则整个宏变为(y) ^ (x ^ y)
,即x
。 这确实是所需的MIN
function。
如果x小于y,则:
-
(x < y)
是1。 -
-(x < y)
是-1。 -
((x ^ y) & -(x < y))
是((x ^ y) & -1)
,它是(x ^ y)
,因为(anything & -1) == anything
,因为-1都是'1'位。 -
y ^ (x ^ y)
是x
,因为XOR是可交换的,y是抵消的。
如果y小于或等于x,则:
-
(x < y)
为0。 -
-(x < y)
为0。 -
((x ^ y) & -(x < y))
是((x ^ y) & 0)
,它是0
,因为(anything & 0) == 0
,因为0都是'0'位。 -
y ^ 0
是y
。
宏当前有一个严重的错误:它需要围绕外部表达式使用括号,否则当在其他表达式中使用时,它将遇到具有运算符优先级的混乱。 例如, MIN(2, 3) * 4
当前扩展为(3) ^ ((2 ^ 3) & -(2 < 3)) * 4
,其计算结果为7,而不是正确的8,因为乘法是在最终的XOR之前完成。 为同一个原因在每个参数替换周围加上括号也是一个好主意:
#define MIN(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
只有当平台使用两个补码整数时,宏仍然有效,并且它可能不比MIN的明显定义快得多:
#define MIN(x, y) ((x) < (y) ? (x) : (y))
注意,如果x < y
, -(x < y)
将仅为0。 所以这相当于:
y ^ 0
哪个是你。
-
<
没有特殊意义,它意味着小于
除了其他人在评论中发布的解释之外,当扩展宏时多次评估参数时,您还应该注意宏中的副作用。
在MIN(x,y)
的通常C风格定义的情况下(例如,如@Boann所指出的),注意x, y
都被扩展两次 。 您的原始定义将x
展开两次,然后展开三次。 在没有进入序列点和短路评估的情况下,让我们说结果可能是不可预测的,至少可以说(甚至可能因编译器而异)。 这是许多C ++程序员认为预处理器宏是邪恶的原因之一。
要查看此操作,请使用MIN(x++, y++)
尝试这两个定义。 对于一个更加邪恶的可能性,考虑一下
result = MIN( x, ShouldOnlyBeCalledOnce_BecauseThisFunctionHasSideEffects(y));
虽然预处理器仍然确实有它的位置(并且你可以用它做任何其他方式无法完成的事情),特别是使用C ++通常是一个好主意,以确定非预处理器解决方案是否出现。
例如:随着重载,C ++实现最初给了我们像
int min(int x, int y) { return (x < y) ? x : y); } some_other_type min(some_other_type x, some_other_type y) { return (x < y) ? x : y; }
模板给了我们更多,如:
template const T& min (const T& a, const T& b) { return !(b < a) ? a : b; }
宏的便利性,但没有参数扩展多次时可能出现的副作用。 顺便说一句,如果你想知道测试的原因是什么!( b < a) ? a : b;
!( b < a) ? a : b;
与(a < b) ? a : b;
(a < b) ? a : b;
,这是因为if (a == b)
,应返回a,并且因为less-than是需要为给定类型定义的唯一关系,以支持各种容器(除其他外)。