Solo quiero voltear un booleano basado en lo que ya es. Si es verdad, hazlo falso. Si es falso, hazlo verdadero.
Aquí está mi extracto de código:
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;
}
c++
c
boolean
boolean-logic
John T
fuente
fuente
¡Claramente necesitas un patrón de fábrica!
:RE
fuente
Si sabe que los valores son 0 o 1, podría hacerlo
flipval ^= 1
.fuente
^
es el operador exclusivo .0^1
es1
, y1^1
es0
. Es lo mismo que agregar si ignoras el bit de acarreo. O puede pensarlo como: si un bit es 1, el resultado es el inverso del otro bit. O puede pensar que se trata de hacer la pregunta: ¿Son estos dos bits diferentes?La solución más fácil que encontré:
fuente
x = !x;
No solo es más corto, sino también más legible.longVariableName ^= true;
es claramente más corto quelongVariableName = !longVariableName;
Y cada programador debe saber XOR.a ^= b
significaa = a ^ b
, donde^
significa XOR. La notacióna °= b
paraa = a ° b
cualquier operador°
es muy común entre la sintaxis C / C ++ / C #.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
Por supuesto, lo más limpio es expandirlo a varias líneas y usar variables temporales para almacenar los objetos, perogRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
es mucho más legible, menos propenso a errores y menos caracteres que el código original. .Solo para información: si en lugar de un número entero su campo requerido es un solo bit dentro de un tipo más grande, use el operador 'xor' en su lugar:
fuente
Esto parece ser un juego para todos ... Je. Aquí hay otra vacación, que supongo que está más en la categoría "inteligente" que algo que recomendaría para el código de producción:
Supongo que sus ventajas son:
Y una desventaja igual de obvia es
Esto está cerca de la solución de @ korona usando?: Pero dado un paso (pequeño) más allá.
fuente
Solo porque mi forma favorita de alternar una bola no está en la lista ...
también funciona :)
(sí,
x = !x;
es más claro y más fácil de leer)fuente
La solución codegolf'ish sería más como:
fuente
Prefiero la solución de John T, pero si quieres ir a todo golf, tu declaración se reduce lógicamente a esto:
fuente
lo mismo va para
fuente
Claramente, necesita una solución flexible que pueda admitir tipos enmascarados como booleanos. Lo siguiente permite eso:
Luego puede especializar esto para diferentes tipos que pueden pretender ser booleanos. Por ejemplo:
Un ejemplo de uso de esta construcción:
No, no hablo en serio.
fuente
Para enteros con valores de 0 y 1 puede intentar:
MWE en C:
fuente
Solo porque me gusta cuestionar el código. Propongo que también puede hacer uso del ternario haciendo algo como esto:
Ejemplo:
fuente