Anche se ci sono già buone risposte, ho pensato che questo approccio potrebbe essere ancora più intuitivo per qualcuno che non conosce l'algebra booleana piuttosto che valutare una tabella di verità.
La prima cosa che vuoi fare è guardare, a quali condizioni vuoi eseguire C. Questo è il caso in cui (a & b)
. Anche quando !a
. Quindi hai (a & b) | !a
.
Se vuoi minimizzare puoi continuare. Proprio come nell'aritmetica "normale", puoi moltiplicare.
(a & b) | !a = (a | !a) & (b | !a)
. a | ! a è sempre vero, quindi puoi semplicemente cancellarlo, il che ti lascia con il risultato minimizzato:b | !a
. Nel caso in cui l'ordine faccia la differenza, perché vuoi controllare b solo se! A è vero (per esempio quando! A è un controllo nullpointer eb è un'operazione sul puntatore come sottolineato da @LordFarquaad nel suo commento), potresti voglio cambiare i due.
L'altro caso (/ * ... * /) verrà sempre eseguito quando c non viene eseguito, quindi possiamo semplicemente inserirlo nell'altro caso.
Vale anche la pena ricordare che probabilmente ha senso in entrambi i casi inserire l'azione c in un metodo.
Il che ci lascia con il seguente codice:
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.
}
In questo modo puoi anche ridurre al minimo i termini con più operandi, che diventa rapidamente brutto con le tabelle di verità. Un altro buon approccio sono le mappe di Karnaugh. Ma non approfondirò ora questo.