我只是想根据它已经是什么来翻转一个布尔值.如果这是真的 - 把它弄错.如果它是假的 - 让它成真.
这是我的代码摘录:
switch(wParam) { case VK_F11: if (flipVal == true) { flipVal = false; } else { flipVal = true; } break; case VK_F12: if (otherVal == true) { otherValVal = false; } else { otherVal = true; } break; default: break; }
John T.. 325
您可以像这样翻转一个值:
myVal = !myVal;
所以你的代码会缩短为:
switch(wParam) { case VK_F11: flipVal = !flipVal; break; case VK_F12: otherVal = !otherVal; break; default: break; }
默认值:break; 没必要. (10认同)
这不仅是最简单的,也是最干净的方式. (5认同)
我一直在代码中使用这个布尔"切换". (4认同)
如果你正在切换像object1-> system1.system2.system3.parameter1那样冗长的东西,那么拥有一个TOGGLE(a)宏会很有帮助.这可以防止出现一些错误,并使其在狭窄的屏幕上更具可读性. (3认同)
Drew.. 74
显然你需要一个工厂模式!
KeyFactory keyFactory = new KeyFactory(); KeyObj keyObj = keyFactory.getKeyObj(wParam); keyObj.doStuff(); class VK_F11 extends KeyObj { boolean val; public void doStuff() { val = !val; } } class VK_F12 extends KeyObj { boolean val; public void doStuff() { val = !val; } } class KeyFactory { public KeyObj getKeyObj(int param) { switch(param) { case VK_F11: return new VK_F11(); case VK_F12: return new VK_F12(); } throw new KeyNotFoundException("Key " + param + " was not found!"); } }
:d
我们也可以为工厂添加单例模式. (7认同)
请注意切换到Java的微妙建议! (2认同)
大声笑......我们还需要一个切换布尔静态库 (2认同)
Mike Dunlave.. 33
如果您知道值为0或1,则可以这样做flipval ^= 1
.
您可以像这样翻转一个值:
myVal = !myVal;
所以你的代码会缩短为:
switch(wParam) { case VK_F11: flipVal = !flipVal; break; case VK_F12: otherVal = !otherVal; break; default: break; }
显然你需要一个工厂模式!
KeyFactory keyFactory = new KeyFactory(); KeyObj keyObj = keyFactory.getKeyObj(wParam); keyObj.doStuff(); class VK_F11 extends KeyObj { boolean val; public void doStuff() { val = !val; } } class VK_F12 extends KeyObj { boolean val; public void doStuff() { val = !val; } } class KeyFactory { public KeyObj getKeyObj(int param) { switch(param) { case VK_F11: return new VK_F11(); case VK_F12: return new VK_F12(); } throw new KeyNotFoundException("Key " + param + " was not found!"); } }
:d
如果您知道值为0或1,则可以这样做flipval ^= 1
.
我找到的最简单的解决方案:
x ^= true;
仅供参考 - 如果不是整数,则所需字段是较大类型中的单个位,请使用'xor'运算符:
int flags; int flag_a = 0x01; int flag_b = 0x02; int flag_c = 0x04; /* I want to flip 'flag_b' without touching 'flag_a' or 'flag_c' */ flags ^= flag_b; /* I want to set 'flag_b' */ flags |= flag_b; /* I want to clear (or 'reset') 'flag_b' */ flags &= ~flag_b; /* I want to test 'flag_b' */ bool b_is_set = (flags & flag_b) != 0;
这似乎是一个免费的...嘿.这是另一个变体,我想这更像是"聪明"的类别而不是我为生产代码推荐的东西:
flipVal ^= (wParam == VK_F11); otherVal ^= (wParam == VK_F12);
我猜它的优点是:
非常简洁
不需要分支
一个明显的缺点是
非常简洁
这接近使用?的@ korona解决方案:但是进一步采取了一个(小)步骤.
只是因为我最喜欢的奇怪的球方式切换bool没有列出...
bool x = true; x = x == false;
也有效.:)
(是的x = !x;
,更清晰,更容易阅读)
codegolf'ish解决方案更像是:
flipVal = (wParam == VK_F11) ? !flipVal : flipVal; otherVal = (wParam == VK_F12) ? !otherVal : otherVal;