1

前几天,一位同事注意到他正在做的常见模式:

if (someBooleanFlag)
{
    someBooleanFlag = FALSE;
    ...do some more stuff...
}

基本上,一个读时清除锁存器。并问我是否知道一种聪明的方法来测试标志并将其清除为单行,这样他就可以摆脱样板 someBooleanFlag = FALSE; 少量。关于这是否是好风格的问题,我发现我能为他做的最好的事情就是

#define TESTANDCLEAR(var) (var ? var-- : 0)

这假设只使用 1 和 0,并且它也不适用于位掩码。我想我会求助于堆栈巫师,看看是否有更好的方法和其他可以使用的技术。

(同样,无需讨论执行 TESTANDCLEAR() 表达式的风格是好是坏,如果我们真的能做到,那更多的是学术练习,以及如何普遍)

4

2 回答 2

4

我认为您不需要做出 0/1 假设,即使您已经采用了这种方法。赋值是返回值的表达式,因此您可以将该宏定义为:

(var ? !(var = false) : false)

或者,您可以使用逗号运算符:

(var ? ((var = false), true) : false)

如果您希望它与N第 th 位的位域测试一起使用,这将有所帮助:

(((var & (1 << N)) ? ((var = var & ~(1 << N)), true) : false)
于 2012-11-27T17:25:47.550 回答
3

丑陋,但我认为这应该工作:

if (someBooleanFlag && !(someBooleanFlag = !someBooleanFlag))

看在上帝的份上,永远不要在生产代码中这样做。

于 2012-11-27T17:29:07.587 回答