Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

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.

Rodolfo Mori4 min de leitura

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:

js
const idadeMinima = true;
const possuiCnh = false;

console.log('A', idadeMinima);
console.log('B', possuiCnh);
console.log('A E B', idadeMinima && possuiCnh);
A true B false A E B false

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:

js
for (const a of [false, true]) {
  for (const b of [false, true]) {
    console.log(a, b, a && b);
  }
}
false false false false true false true false false true true true

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:

js
for (const cupom of [false, true]) {
  for (const assinatura of [false, true]) {
    console.log(cupom, assinatura, cupom || assinatura);
  }
}
false false false false true true true false true true true true

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.

js
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));
false false false false true true true false true true true false

NÃO inverte o resultado

Negação troca verdadeiro por falso e falso por verdadeiro. Nomear uma condição positiva evita empilhar negações:

js
const contaAtiva = true;
console.log(!contaAtiva);
console.log(!!contaAtiva);
false true

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:

js
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);
false false false false false false true false false true false false false true true false true false false false true false true false true true false false true true true true linhas 8

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:

js
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);
  }
}
false false true true true false true true true true true false true true true true true false false true

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:

js
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);
chamadas no E 2

No OU, a direita só é necessária quando a esquerda é falsa:

js
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);
chamadas no OU 2

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:

js
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);
[ [ true, false, true ], [ true, true, false ], [ true, true, true ] ]

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.

  • tabela verdade
  • operadores logicos
  • de morgan
  • curto circuito
  • condicao composta

Perguntas frequentes

Quantas linhas uma tabela verdade precisa ter?
Para n condições booleanas independentes, ela tem 2 elevado a n linhas: duas condições geram quatro combinações e três geram oito.
Curto-circuito muda o resultado lógico?
Não quando as expressões são booleanas puras. Ele muda quais termos são avaliados, algo importante quando o segundo termo chama função, lê propriedade ou produz efeito colateral.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

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

  1. ECMAScript — Binary Logical Operators — tc39.es
  2. ECMAScript — Logical NOT Operator — tc39.es

Continue por aqui