Aunque ya hay buenas respuestas, pensé que este enfoque podría ser aún más intuitivo para alguien que es nuevo en el álgebra booleana que evaluar una tabla de verdad.
Lo primero que quiere hacer es mirar, bajo qué condiciones desea ejecutar C. Este es el caso cuando (a & b)
. También cuando !a
. Entonces tienes (a & b) | !a
.
Si quieres minimizar puedes continuar. Al igual que en la aritmética "normal", puede multiplicarse.
(a & b) | !a = (a | !a) & (b | !a)
. a | ! a siempre es cierto, por lo que puedes tacharlo, lo que te deja con el resultado minimizado:b | !a
. En caso de que el orden marque la diferencia, porque desea verificar b solo si! A es verdadero (por ejemplo, cuando! A es una comprobación de puntero nulo yb es una operación en el puntero como @LordFarquaad señaló en su comentario), puede Quiero cambiar los dos.
El otro caso (/ * ... * /) siempre se ejecutará cuando c no se ejecute, por lo que podemos ponerlo en el caso else.
También vale la pena mencionar que probablemente tenga sentido de cualquier manera poner la acción c en un método.
Lo que nos deja con el siguiente código:
if (!A || B)
{
doActionC() // execute method which does action C
}
else
{
/* ... */ // what ever happens here, you might want to put it into a method, too.
}
De esta manera, también puede minimizar los términos con más operandos, lo que rápidamente se vuelve feo con las tablas de verdad. Otro buen enfoque son los mapas de Karnaugh. Pero no voy a profundizar en esto ahora.