Tabela verdade: E, OU e NÃO em condições compostas
Como montar a tabela verdade de uma condição composta, ler as linhas do E e do OU e usar De Morgan para reescrever a negação sem errar o sentido.
Tabela verdade enumera todas as combinações de condições booleanas e registra o resultado de E, OU e NÃO. Ela troca o palpite por cobertura: se uma regra tem dois estados independentes, você confere quatro linhas.
O domínio é o acesso a um veículo da empresa. A pessoa precisa ter 18 anos ou mais e possuir CNH. A estrutura condicional executa o caminho; a tabela prova que a pergunta representa a política.
Quando uma pergunta só não resolve
Separe a frase em proposições: A significa idade mínima atingida; B significa CNH válida. Depois combine:
const idadeMinima = true;
const possuiCnh = false;
console.log('A', idadeMinima);
console.log('B', possuiCnh);
console.log('A E B', idadeMinima && possuiCnh);Pense em dois interruptores ligados em série: os dois precisam fechar o circuito. O limite é que JavaScript devolve operandos em operações lógicas, não necessariamente booleanos. Aqui usamos valores booleanos para manter o modelo exato.
E só é verdadeiro numa linha
Gere as quatro combinações na mesma ordem da tabela manual:
for (const a of [false, true]) {
for (const b of [false, true]) {
console.log(a, b, a && b);
}
}Se qualquer requisito obrigatório falha, o conjunto falha. Em linguagem de negócio: idade sem CNH não autoriza, e CNH sem idade mínima também não.
OU só é falso numa linha
Uma promoção aceita cupom ou assinatura ativa. Basta um caminho verdadeiro:
for (const cupom of [false, true]) {
for (const assinatura of [false, true]) {
console.log(cupom, assinatura, cupom || assinatura);
}
}Esse é o OU inclusivo: com os dois verdadeiros, o resultado continua verdadeiro. Quando o requisito quer “um ou outro, mas não ambos”, ele descreve OU exclusivo e precisa de outra expressão.
function ouExclusivo(a, b) {
return a !== b;
}
console.log(false, false, ouExclusivo(false, false));
console.log(false, true, ouExclusivo(false, true));
console.log(true, false, ouExclusivo(true, false));
console.log(true, true, ouExclusivo(true, true));NÃO inverte o resultado
Negação troca verdadeiro por falso e falso por verdadeiro. Nomear uma condição positiva evita empilhar negações:
const contaAtiva = true;
console.log(!contaAtiva);
console.log(!!contaAtiva);Duas negações convertem para booleano e retornam ao sentido original. Isso é recurso da linguagem, não convite para escrever regras como !naoEstaInativo.
Duas condições geram quatro linhas; três geram oito
Cada condição dobra o número de combinações. Adicione autorização do gestor (C) e conte:
let linhas = 0;
for (const a of [false, true]) {
for (const b of [false, true]) {
for (const c of [false, true]) {
linhas += 1;
console.log(a, b, c, a && b && c);
}
}
}
console.log('linhas', linhas);Não precisa decorar 2^n: observe que cada linha anterior precisa de uma versão com C=false e outra com C=true.
De Morgan sem trocar o sentido
Negar “A e B” equivale a “não A ou não B”. Negar “A ou B” equivale a “não A e não B”. Prove nas quatro combinações:
for (const a of [false, true]) {
for (const b of [false, true]) {
const esquerda = !(a && b);
const direita = !a || !b;
console.log(a, b, esquerda, direita, esquerda === direita);
}
}O operador dentro troca (&& vira ||) e cada termo recebe negação. Esquecer a troca muda a regra. Use a tabela quando reescrever uma condição de autorização ou segurança.
Curto-circuito pula o segundo termo
No E, se a esquerda é falsa, o resultado já está decidido. Nas quatro combinações, a função da direita é chamada apenas quando A é verdadeiro:
let chamadas = 0;
function conferir(valor) {
chamadas += 1;
return valor;
}
for (const a of [false, true]) {
for (const b of [false, true]) a && conferir(b);
}
console.log('chamadas no E', chamadas);No OU, a direita só é necessária quando a esquerda é falsa:
let chamadas = 0;
function conferir(valor) {
chamadas += 1;
return valor;
}
for (const a of [false, true]) {
for (const b of [false, true]) a || conferir(b);
}
console.log('chamadas no OU', chamadas);O número real é dois em ambos os casos para esta ordem de quatro combinações. A diferença é quais linhas chamam: E chama com esquerda verdadeira; OU, com esquerda falsa.
Missão: regra de acesso sem palpite
Uma área exige assinatura ativa e (perfil de administrador ou autorização temporária). Escreva primeiro A E (B OU C), gere oito linhas e compare com a função:
function podeEntrar(assinatura, administrador, temporaria) {
return assinatura && (administrador || temporaria);
}
const aprovados = [];
for (const a of [false, true]) for (const b of [false, true]) for (const c of [false, true]) {
if (podeEntrar(a, b, c)) aprovados.push([a, b, c]);
}
console.log(aprovados);Depois de preencher, transforme cada linha em frase. “Assinatura ativa, sem perfil administrativo e com autorização temporária permite entrada” é mais fácil de revisar com produto e segurança que uma sequência de booleanos. Se a frase parece absurda, investigue agrupamento e significado das proposições.
Não reduza a tabela cedo demais. Linhas que produzem o mesmo resultado podem chegar a ele por razões diferentes e exigir mensagens distintas. A regra de acesso pode negar por assinatura vencida ou falta de autorização; o booleano final é igual, mas a saída para a pessoa e o registro de auditoria não precisam ser.
Ao passar para testes, use nomes que descrevem o cenário em vez de numerar casos. Preserve todas as combinações quando a política é crítica. Para três condições são oito linhas, uma quantidade pequena diante do custo de uma autorização errada.
Curto-circuito exige cuidado adicional com propriedade aninhada. Uma guarda à esquerda pode impedir leitura de objeto ausente à direita. Isso é uso legítimo, mas a ordem passa a carregar segurança de execução além da lógica. Documente com um caso em que o objeto não existe.
Quando a tabela crescer demais, questione o modelo. Muitas condições independentes podem indicar estados que deveriam ser representados por uma enumeração, como pendente, aprovado e bloqueado, em vez de vários booleanos capazes de formar combinações impossíveis. Melhorar o estado pode eliminar linhas antes de otimizar a condição.
O critério de sucesso é explicar as cinco linhas negadas e as três aprovadas. Depois aplique a condição dentro de um laço de repetição, revise a expressão, consulte o guia de lógica e avance pela trilha.
Perguntas frequentes
Quantas linhas uma tabela verdade precisa ter?
Curto-circuito muda o resultado lógico?
Dúvidas e comentários
Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.
Entrar para perguntarÉ o mesmo login gratuito dos cursos.
Nenhuma dúvida por aqui ainda — a primeira pode ser a sua.
Todo o código deste artigo foi executado em Node v26.3.0, e as saídas exibidas são as reais — como produzimos este conteúdo.
Fontes consultadas
- ECMAScript — Binary Logical Operators — tc39.es
- ECMAScript — Logical NOT Operator — tc39.es


