前几天,一位同事注意到他正在做的共同模式:
if (someBooleanFlag)
{
someBooleanFlag = FALSE;
...do some more stuff...
}
基本上是一个清除读取锁存器。并且问我是否知道一种聪明的方法来测试旗帜并将其清除为单线,因此他可以摆脱样板someBooleanFlag = FALSE;位。关于这是否是好风格的问题,我发现我能为他做的最好的事情就像是
#define TESTANDCLEAR(var) (var ? var-- : 0)
这假设只使用1和0,并且它也不能在位掩码上工作。我想我会转向堆栈的向导,看看是否有更好的方法和其他可以使用的技术。
(同样,不需要讨论做TESTANDCLEAR()表达的风格是坏还是好,如果我们真的能做到这一点,那就更多的是学术练习,以及如何做到这一点)
答案 0 :(得分:4)
我认为你不需要做出0/1假设,即使你已经采用了这种方法。赋值是返回值的表达式,因此您可以将该宏定义为:
(var ? !(var = false) : false)
或者,您可以使用逗号运算符:
(var ? ((var = false), true) : false)
如果您希望将其用于N
位的位域测试,那将有所帮助:
(((var & (1 << N)) ? ((var = var & ~(1 << N)), true) : false)
答案 1 :(得分:3)
丑陋,但我认为这应该有效:
if (someBooleanFlag && !(someBooleanFlag = !someBooleanFlag))
因为对上帝的爱永远不会在生产代码中这样做。