Embora já existam boas respostas, pensei que essa abordagem poderia ser ainda mais intuitiva para alguém que é novo na álgebra booleana do que para avaliar uma tabela da verdade.
A primeira coisa que você quer fazer é procurar, sob quais condições você deseja executar C. É esse o caso quando (a & b)
. Também quando!a
. Então você tem (a & b) | !a
.
Se você quiser minimizar, pode continuar. Assim como na aritmética "normal", você pode multiplicar.
(a & b) | !a = (a | !a) & (b | !a)
. a | ! a é sempre verdade, então você pode simplesmente riscar, o que deixa o resultado minimizado:b | !a
. Caso a ordem faça diferença, porque você deseja marcar b apenas se! A for verdadeiro (por exemplo, quando! A é uma verificação de ponteiro nulo eb é uma operação no ponteiro como @LordFarquaad apontado em seu comentário), você pode quer mudar os dois.
O outro caso (/ * ... * /) é sempre será executado quando c não for executado, portanto, podemos apenas colocá-lo no caso else.
Também vale mencionar que provavelmente faz sentido de qualquer maneira colocar a ação c em um método.
O que nos deixa com o seguinte 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.
}
Dessa forma, você também pode minimizar os termos com mais operandos, o que rapidamente fica feio com as tabelas verdadeiras. Outra boa abordagem são os mapas de Karnaugh. Mas não vou aprofundar isso agora.