Estruturas condicionais encadeadas e aninhadas
Diferencie cadeias e decisões aninhadas, organize a ordem dos testes e simplifique fluxos sem alterar seus caminhos.

Encadear compara alternativas; aninhar cria dependência
Uma condicional encadeada organiza várias alternativas no mesmo nível. As condições são testadas em ordem e o primeiro ramo verdadeiro é executado.
SE prioridade = 3 ENTÃO
fila <- "crítica"
SENÃO SE prioridade = 2 ENTÃO
fila <- "alta"
SENÃO SE prioridade = 1 ENTÃO
fila <- "normal"
SENÃO
fila <- "revisão"
FIM SE
Uma condicional aninhada coloca uma decisão dentro do bloco de outra. A pergunta interna só é alcançada se o fluxo entrar no ramo que a contém.
SE contaAtiva ENTÃO
SE possuiPermissao ENTÃO
liberar operação
SENÃO
negar por falta de permissão
FIM SE
SENÃO
negar por conta inativa
FIM SE
Na cadeia, as perguntas competem para classificar um caso. No aninhamento, a segunda pergunta depende do contexto criado pela primeira. Essa distinção é mais importante que a aparência da sintaxe.
Essas formas ampliam o if e else para problemas com mais caminhos, mas não são intercambiáveis em todas as situações.
Como funciona uma cadeia else if
Considere a classificação de um chamado:
SE sistemaIndisponivel ENTÃO
prioridade <- "crítica"
SENÃO SE variosUsuariosAfetados ENTÃO
prioridade <- "alta"
SENÃO SE existeAlternativaTemporaria ENTÃO
prioridade <- "média"
SENÃO
prioridade <- "normal"
FIM SE
A execução segue quatro regras:
- começa pela primeira condição;
- se ela for falsa, avalia a próxima;
- ao encontrar a primeira verdadeira, executa seu bloco;
- ignora todos os ramos restantes da cadeia.
O else final é opcional. Quando existe, cobre tudo o que não satisfez as condições anteriores. Aqui ele garante que prioridade receba um valor mesmo quando nenhuma situação especial ocorre.
Python usa elif; JavaScript e C# usam else if:
if sistema_indisponivel:
prioridade = "crítica"
elif varios_usuarios_afetados:
prioridade = "alta"
elif existe_alternativa_temporaria:
prioridade = "média"
else:
prioridade = "normal"
if (sistemaIndisponivel) {
prioridade = "crítica";
} else if (variosUsuariosAfetados) {
prioridade = "alta";
} else if (existeAlternativaTemporaria) {
prioridade = "média";
} else {
prioridade = "normal";
}
Apesar da diferença de palavras, as duas versões selecionam no máximo um bloco.
A ordem dos ramos faz parte da regra
Condições de uma cadeia podem se sobrepor. Ao classificar uma nota, nota >= 90 também satisfaz nota >= 70. Por isso, a ordem define qual resultado prevalece:
SE nota >= 90 ENTÃO
conceito <- "A"
SENÃO SE nota >= 70 ENTÃO
conceito <- "B"
SENÃO
conceito <- "C"
FIM SE
Com nota = 95, o primeiro ramo vence. Se nota >= 70 vier primeiro, o ramo A nunca será alcançado, porque todas as notas de 90 ou mais já serão capturadas pelo teste mais geral.
Organize faixas sobrepostas do caso mais específico ou restritivo para o mais geral. Outra opção é escrever intervalos sem sobreposição:
SE nota >= 90 ENTÃO
conceito <- "A"
SENÃO SE nota >= 70 E nota < 90 ENTÃO
conceito <- "B"
SENÃO
conceito <- "C"
FIM SE
A condição adicional documenta a faixa, mas é redundante durante a execução: chegar ao segundo teste já significa que nota >= 90 foi falso. Escolha a forma mais clara para o público e registre os limites com testes.
Cadeia não é o mesmo que vários if independentes
Compare a cadeia:
SE clienteVip ENTÃO
adicionar brinde vip
SENÃO SE primeiraCompra ENTÃO
adicionar brinde de boas-vindas
FIM SE
com duas decisões independentes:
SE clienteVip ENTÃO
adicionar brinde vip
FIM SE
SE primeiraCompra ENTÃO
adicionar brinde de boas-vindas
FIM SE
Se a pessoa for VIP e também estiver na primeira compra, a cadeia adiciona somente o primeiro brinde. As decisões independentes adicionam os dois.
Pergunte se os resultados são exclusivos ou cumulativos:
- use uma cadeia quando apenas uma classificação ou ação deve vencer;
- use decisões independentes quando mais de uma ação pode ocorrer no mesmo caso.
Não transforme automaticamente todo conjunto de if em else if. Isso pode remover comportamentos que deveriam coexistir.
Como funciona uma condicional aninhada
No controle de uma operação, verificar permissão só faz sentido depois de confirmar que a conta está ativa:
SE contaAtiva ENTÃO
SE possuiPermissao ENTÃO
liberar operação
SENÃO
negar por falta de permissão
FIM SE
SENÃO
negar por conta inativa
FIM SE
Existem dois níveis:
- a decisão externa divide contas ativas e inativas;
- a decisão interna divide contas ativas com e sem permissão.
Quando contaAtiva é falsa, possuiPermissao nem é consultada. A decisão interna pertence somente ao contexto “conta ativa”. Esse é um uso legítimo do aninhamento: a pergunta seguinte depende semanticamente do ramo anterior.
Cada nível aumenta a quantidade de caminhos. Nesse exemplo existem três resultados alcançáveis:
| Conta ativa | Possui permissão | Caminho | Resultado |
|---|---|---|---|
| não | não importa | else externo | negar por conta inativa |
| sim | não | if externo → else interno | negar por falta de permissão |
| sim | sim | if externo → if interno | liberar operação |
“Não importa” significa que o valor não é avaliado nesse caminho. Um teste manual deve registrar também quais perguntas foram alcançadas.
Qual if pertence a cada else?
Em linguagens que permitem omitir chaves, esta escrita é perigosa:
SE contaAtiva
SE possuiPermissao
liberar operação
SENÃO
negar operação
O recuo visual pode sugerir uma relação, mas linguagens como Java, C e C# associam o else ao if compatível mais próximo quando não há delimitadores que indiquem outra estrutura. Esse comportamento é conhecido como problema do else pendente (dangling else).
Use blocos explícitos:
if (contaAtiva) {
if (possuiPermissao) {
liberarOperacao();
} else {
negarPorFaltaDePermissao();
}
} else {
negarPorContaInativa();
}
As chaves definem o pertencimento em JavaScript, C# e Java. Em Python, a indentação faz parte da sintaxe e determina os blocos. Em qualquer linguagem, formatação consistente ajuda pessoas a enxergarem a mesma árvore que a linguagem executa.
Quando combinar condições e quando manter níveis
Este aninhamento:
SE contaAtiva ENTÃO
SE possuiPermissao ENTÃO
liberar operação
FIM SE
FIM SE
pode ser combinado sem alterar o único bloco executado:
SE contaAtiva E possuiPermissao ENTÃO
liberar operação
FIM SE
A condição composta reduz um nível quando as duas perguntas apenas controlam a mesma ação e não precisam de respostas diferentes.
Não combine quando cada falha exige tratamento próprio:
SE contaAtiva E possuiPermissao ENTÃO
liberar operação
SENÃO
negar operação
FIM SE
Essa versão perde a distinção entre conta inativa e falta de permissão. O aninhamento anterior preserva mensagens e ações específicas.
O critério não é “menos linhas”. Pergunte se os ramos representam resultados diferentes e se a segunda pergunta só é válida dentro do primeiro contexto.
Reduza profundidade sem esconder a regra
Muitos níveis tornam difícil saber quais condições estão ativas. Considere:
SE entradaPresente ENTÃO
SE formatoValido ENTÃO
SE usuarioAutorizado ENTÃO
processar solicitação
SENÃO
informar falta de autorização
FIM SE
SENÃO
informar formato inválido
FIM SE
SENÃO
informar entrada ausente
FIM SE
Uma forma de simplificar é tratar impedimentos antes e manter o caminho principal linear:
SE NÃO entradaPresente ENTÃO
informar entrada ausente
encerrar solicitação
FIM SE
SE NÃO formatoValido ENTÃO
informar formato inválido
encerrar solicitação
FIM SE
SE NÃO usuarioAutorizado ENTÃO
informar falta de autorização
encerrar solicitação
FIM SE
processar solicitação
Essa transformação só é equivalente se encerrar solicitação impedir a continuação. Em uma linguagem real, isso pode ser um return, uma exceção adequada ou outra estrutura definida pelo contexto. Sem interrupção, o processamento ainda seria alcançado.
Outras formas de reduzir complexidade são:
- nomear resultados intermediários;
- combinar condições que controlam exatamente o mesmo bloco;
- eliminar testes repetidos já garantidos por um ramo anterior;
- separar classificação de execução quando a mesma decisão aparece várias vezes;
- representar o fluxo antes de codificar com um fluxograma.
Não aplique essas transformações mecanicamente. Compare os caminhos antes e depois para confirmar que mensagens, alterações de estado e interrupções continuam equivalentes.
Teste caminhos, ordem e alcançabilidade
Para a cadeia de prioridade, cubra pelo menos:
| Sistema indisponível | Vários afetados | Alternativa temporária | Resultado esperado |
|---|---|---|---|
| sim | sim | sim | crítica |
| não | sim | sim | alta |
| não | não | sim | média |
| não | não | não | normal |
O primeiro caso confirma que o primeiro ramo prevalece mesmo quando condições posteriores também seriam verdadeiras. Os demais fazem cada resultado vencer uma vez.
Para o aninhamento, teste cada folha da árvore, não todas as combinações brutas. Se a conta está inativa, variar possuiPermissao não cria outro caminho, pois a pergunta interna não é alcançada.
Ao revisar, responda:
- cada resultado necessário possui um caminho?
- algum ramo geral torna outro inalcançável?
- alternativas exclusivas estão em uma cadeia?
- ações cumulativas permanecem em decisões independentes?
- cada
elseestá associado aoifpretendido? - todas as folhas relevantes foram exercitadas?
Erros comuns
Colocar a condição geral antes da específica
Uma faixa ampla captura casos que deveriam chegar a um ramo mais específico. Teste sobreposição e ordem.
Confundir cadeia com decisões independentes
Adicionar else transforma ações possivelmente cumulativas em alternativas exclusivas.
Aninhar perguntas que controlam a mesma ação
Quando não há tratamentos intermediários, uma condição composta pode comunicar melhor a regra.
Combinar condições que precisam de respostas diferentes
Uma expressão única pode esconder qual requisito falhou e eliminar mensagens específicas.
Confiar apenas na indentação em linguagens com chaves
O recuo não substitui delimitadores sintáticos. Use blocos explícitos para evitar else ambíguo.
Simplificar sem preservar a interrupção
Uma verificação antecipada que não encerra o fluxo pode permitir a execução do caminho principal mesmo após uma falha.
Pratique com faixas e dependências
Uma entrega recebe a classificação:
- “bloqueada” quando o endereço é inválido;
- “expressa” quando o endereço é válido e o prazo é de até dois dias;
- “padrão” quando o endereço é válido e o prazo é maior que dois dias.
Primeiro represente a regra com uma decisão externa sobre enderecoValido e uma decisão interna sobre prazoDias <= 2. Depois reescreva como cadeia e compare os caminhos.
Teste:
- endereço inválido com prazo
1; - endereço válido com prazo
2; - endereço válido com prazo
3.
Explique por que o prazo não deve influenciar o primeiro caso e confirme que o limite 2 pertence à entrega expressa.
O que você deve guardar
Uma cadeia organiza alternativas exclusivas no mesmo nível e executa o primeiro ramo verdadeiro. O aninhamento coloca uma decisão dentro de um ramo porque a pergunta seguinte depende daquele contexto. Vários if independentes, por sua vez, permitem que mais de uma ação execute.
Escolha a estrutura pela relação entre resultados, não apenas pelo formato mais curto. Ordene cadeias conscientemente, delimite blocos, preserve tratamentos específicos e teste cada folha alcançável. Em seguida, veja quando a seleção múltipla com switch ou case torna mais clara uma escolha baseada em casos discretos.
Referências
- Microsoft Learn — Selection statements in C#. Acesso em 10 set. 2026.
- Python Documentation — A instrução
if. Acesso em 10 set. 2026. - MDN Web Docs —
if...else. Acesso em 10 set. 2026. - Oracle — Java Language Specification: Statements e
if. Acesso em 10 set. 2026. - Microsoft Learn —
ifStatement (C): nestedifandelse. Acesso em 10 set. 2026.