Publicidade

Desvio Condicional (Instrução if)

Como escrever instruções if em C, com fluxogramas para entendimento visual.

📖 O que aprender nesta página
✅ Essencial saber
  • if (cond) { ... } forma básica
  • else trata o caso falso
  • else if para três ou mais ramos — o mais restrito primeiro
  • Diferente de zero é verdadeiro, 0 é falso
⭐ Leia se tiver tempo
  • Ternário cond ? a : b
  • Mantenha as chaves mesmo para corpos de uma linha
  • Indentação de if aninhado

Instrução if — Desvio Baseado em uma Condição

Programas em C rodam de cima para baixo por padrão, mas muitas vezes você só quer que um bloco rode quando alguma condição for verdadeira. É exatamente isso que o if faz.
Pense nele como a palavra "se": "se a nota for 60 ou mais, imprima Aprovado," ou "se o saldo for zero ou menor, avise o usuário."
if (condicao) {
  // executa quando a condição for verdadeira
}
Início
Condição verdadeira?
Sim
Executa o corpo
Não
Pula
Próxima instrução

Um primeiro exemplo concreto

int score = 75;
if (score >= 60) {
    printf("Aprovado\n");
}
Quando score >= 60 é verdadeiro, o corpo dentro de { } é executado. Se score for 50, a condição é falsa e o corpo é totalmente ignorado.

Operadores de comparação usados em condições

OperadorSignificadoExemploVerdadeiro quando
==igual ax == 5x é 5
!=diferente dex != 0x não é 0
<menor quex < 10x é menor que 10
<=menor ou igualx <= 10x é no máximo 10
>maior quex > 0x é maior que 0
>=maior ou igualx >= 60x é pelo menos 60
💡 = e == são diferentes: = é atribuição, == é comparação. Veja "Erros comuns" abaixo.

Veracidade em C — qualquer coisa diferente de zero é verdadeiro

Antes do C99, C não tinha um tipo bool dedicado (o C99 adicionou stdbool.h), então valores de verdade são apenas inteiros.
verdadeiro
qualquer coisa diferente de zero
1, -1, 100, 3.14 ...
falso
apenas 0
if (1)       // sempre verdadeiro - o corpo sempre roda
if (0)       // sempre falso - o corpo nunca roda
if (score)   // verdadeiro quando score é diferente de zero

Por que as chaves { } importam

As chaves { } agrupam várias instruções no corpo do if. Para um corpo de uma única instrução, as chaves são tecnicamente opcionais — mas iniciantes devem sempre escrevê-las.
✅ Com chaves (seguro)
if (x > 0) {
    printf("positivo\n");
    count++;
}
❌ Sem chaves, "corpo" de duas linhas vira bug
if (x > 0)
    printf("positivo\n");
    count++;  // NAO esta dentro do if - sempre roda
⚠️ A indentação engana: mesmo que count++; pareça estar dentro do if, sem chaves somente a próxima instrução conta como corpo.

else — o que executa quando a condição é falsa

else é a cláusula "caso contrário". Quando a condição do if é falsa, o corpo do else é executado no lugar.
Em português claro: "se X, então faça A; caso contrário faça B."
int score = 45;
if (score >= 60) {
    printf("Aprovado\n");
} else {
    printf("Reprovado\n");
}
Início
score >= 60 ?
Sim
imprime "Aprovado"
Não
imprime "Reprovado"
Próxima instrução
Ponto-chave: exatamente um dos dois corpos executa — o corpo do if quando verdadeiro, o corpo do else quando falso. Nunca os dois, nunca nenhum.

else não aceita condição

else sozinho cobre "qualquer caso que o if não pegou," então não há onde colocar uma condição. Se você precisa de um "caso contrário" condicional, use else if (visto abaixo).
// C invalido
else (x < 0) { ... }

// tambem invalido
if (x > 0) { ... }
else else { ... }

else é opcional

else não é obrigatório. Se você só se importa com o caso "verdadeiro," basta deixá-lo de fora.
Com else (duas vias)
if (age >= 18) {
    printf("adulto\n");
} else {
    printf("menor\n");
}
Sem else (só o caso verdadeiro)
if (errors > 0) {
    printf("aviso\n");
}
// nao faz nada no sucesso

else if — três ou mais ramos

if + else cobre dois resultados. Para três ou mais casos, encadeie else if. Isso é só uma forma abreviada de "coloque outro if dentro do else."
int score = 75;
if (score >= 90) { printf("Excelente\n"); }
else if (score >= 70) { printf("Bom\n"); }
else if (score >= 50) { printf("Aprovado\n"); }
else { printf("Reprovado\n"); }
Avaliado de cima para baixo: apenas o primeiro ramo cuja condição é verdadeira roda; tudo depois é ignorado.
⚠️ A ordem importa: se você colocar score >= 50 primeiro, notas de 90 e 70 também batem ali, então todo mundo apenas "Passa." Sempre coloque a condição mais restrita (mais estreita) primeiro.
O else final captura "nenhum dos anteriores." Omita-o e nada acontece quando nenhum caso bate — uma inação silenciosa. Escrevê-lo explicitamente é mais seguro.

Demo de Notas

Classificação
Bom
Ramo executado
else if (score >= 70)

Erros comuns com if — onde iniciantes empacam

Os bugs abaixo compilam limpo, mas se comportam mal em tempo de execução. Aprenda a reconhecer cada um de relance.
🔴 Armadilha 1: confundir = (atribuição) com == (igualdade)
int x = 10;
if (x = 5) {    // = simples - era pra ser comparacao
    printf("x eh 5\n");
}
O que acontece:
1. x = 5 atribui 5 a x, e o valor da expressão é 5.
2. Como 5 é diferente de zero, a condição é sempre verdadeira — o printf roda todas as vezes.
3. Além disso, x foi silenciosamente sobrescrito de 10 para 5.
Correção: sempre use == para comparação. Algumas equipes colocam a constante à esquerda (if (5 == x)) para que um erro de digitação como = vire um erro de compilação.
🔴 Armadilha 2: if (cond); — ponto e vírgula perdido
if (score >= 60);   // ; perdido
{
    printf("Aprovado\n");
}
O que acontece:
1. if (cond); significa "execute uma instrução vazia quando verdadeiro" — um if inútil.
2. O { ... } que vem depois é apenas um bloco comum, sem relação com o if, então sempre executa.
3. "Aprovado" imprime independentemente da nota.
Correção: nunca coloque ; imediatamente após if (cond) — vá direto ao {.
🔴 Armadilha 3: comparar double com ==
double x = 0.1 + 0.2;
if (x == 0.3) {    // quase nunca verdadeiro!
    printf("igual\n");
}
O que acontece:
Por causa do arredondamento em ponto flutuante, 0.1 + 0.2 é na verdade 0.30000000000000004 — não exatamente igual a 0.3.
Correção: verifique se a diferença absoluta é pequena o suficiente.
#include <math.h>
if (fabs(x - 0.3) < 1e-9) { ... }
⚠️ Armadilha 4: 0 < x < 10 — notação matemática não funciona
if (0 < x < 10) { ... }     // analisado da esquerda pra direita - nao eh o que voce pensa!
O que acontece:
1. 0 < x é avaliado primeiro, resultando em 1 (verdadeiro) ou 0 (falso).
2. Depois (resultado) < 10 — tanto 0 quanto 1 são menores que 10, então a expressão inteira é sempre verdadeira.
3. Seu "teste de intervalo" passa para qualquer x.
Correção: combine os dois testes com &&:
if (0 < x && x < 10) { ... }
⚠️ Armadilha 5: o else pendente
if (a > 0)
    if (b > 0)
        printf("ambos positivos\n");
else
    printf("???\n");     // pertence a qual if?
Resposta: em C, else liga-se ao if não pareado mais próximo — o if (b > 0) interno. A indentação não diz nada aqui.
Sempre use { } para matar a ambiguidade.
💡 Extra: if (!x) é o mesmo que if (x == 0)
! é o NÃO lógico: inverte verdadeiro para falso e vice-versa. if (x) executa quando x é diferente de zero; if (!x) executa quando x é zero. Você vê esse atalho em código C real o tempo todo.

Execução Passo a Passo — Instrução if

if_demo.c

Estado das Variáveis

NomeTipoValor

Avaliação da Condição

Saída Padrão

 

Experimente — Instrução if

my_if.c
Saída
Clique em "Executar" para rodar...
💡 Experimente estas ideias também
Publicidade

Aulas Relacionadas

Operadores
Operadores de Comparação e Lógicos
Operadores de comparação em C (==, !=, <, >) e operadores lógicos (&&, ||, !).
Condicionais
else if / switch
Como usar else if e switch em C para desvios múltiplos.
Condicionais
Teste da Instrução if
Teste para verificar seu entendimento das instruções if em C.
← Aula anterior
Aula 11: Operadores de Comparação e Lógicos
Próxima aula →
Aula 14: Teste (if)

Teste de Revisão

Teste seu entendimento desta aula!

Q1. O que acontece quando a condição de uma instrução if é 0?

O bloco é executado
O bloco não é executado
Causa um erro

Em C, 0 é falso e qualquer coisa diferente de zero é verdadeiro. Quando a condição é 0, o bloco if é pulado.

Q2. O que significa if (x = 5)?

Testa se x é igual a 5
Atribui 5 a x; sempre verdadeiro
Erro de compilação

= é atribuição, então 5 é armazenado em x. O resultado da atribuição é 5 (diferente de zero, logo verdadeiro), significando que o ramo sempre roda. Um bug clássico — você quis dizer ==.

Q3. Quantos elses um if pode ter?

Apenas um
Qualquer número
Até dois

Cada if pode ter apenas um else. Use else if para desvios múltiplos.

Q4. O que este código imprime?

int x = 0;
if (x) printf("A\n");
else  printf("B\n");
A
B
Nada
Erro de compilação

if (x) com x=0 é falso, então o corpo do if é pulado e o printf("B\n") do else roda.

Q5. O que este código imprime?

int x = 10;
if (x = 0)
    printf("zero\n");
else
    printf("diferente de zero: %d\n", x);
zero
diferente de zero: 10
diferente de zero: 0
Erro de compilação

x = 0 atribui 0 a x, e a expressão avalia para 0. Como condição, 0 é falso, então o else roda — mas x já foi sobrescrito para 0, então sai "diferente de zero: 0".
Essa é a clássica armadilha = vs ==: sua variável muda silenciosamente.

Q6. O que este código imprime?

int score = 45;
if (score >= 60);
{
    printf("Aprovado\n");
}
Nada
Aprovado
Erro de compilação

O ; perdido transforma o if numa instrução vazia. O bloco que segue não tem nada a ver com o if, então sempre roda.

Q7. Com a=5, b=-3, o que isto imprime?

if (a > 0)
    if (b > 0)
        printf("ambos positivos\n");
else
    printf("a eh negativo\n");
ambos positivos
a é negativo
Nada

O infame else pendente. Apesar da indentação, else liga-se ao if mais próximo — neste caso if (b > 0). Com b = -3, a condição interna é falsa, então o else imprime "a é negativo" — mesmo a sendo positivo!
Use { } para evitar isso sempre.

Q8. Qual é a forma correta em C de escrever "10 ≤ x ≤ 20"?

if (10 <= x <= 20)
if (x >= 10 || x <= 20)
if (x >= 10 && x <= 20)
if (x >= 10 & x <= 20)

Comparações encadeadas no estilo matemático não existem em C. Use && (E lógico) para juntar dois testes. A opção 2 com || (OU) é sempre verdadeira; a opção 4 usa & bit a bit, que é um operador totalmente diferente.

Q9. Com x=0, y=10, o que isto imprime?

if (x != 0 && y / x > 2) {
    printf("grande\n");
} else {
    printf("pequeno\n");
}
Crash por divisão por zero
pequeno
grande

O && de C usa avaliação por curto-circuito: se o lado esquerdo for falso, o lado direito não é avaliado. Aqui x != 0 é falso, então y / x é pulado — sem divisão por zero, e o else imprime "pequeno".
Esse padrão é prático para coisas como checar se um ponteiro não é NULL antes de desreferenciá-lo.

Q10. Como testar "x é divisível por 3"?

if (x / 3 == 0)
if (x % 3 == 0)
if (x mod 3 == 0)
if (x \ 3 == 0)

O operador módulo em C é %. "x é divisível por n?" → x % n == 0. "x é par?" → x % 2 == 0. Um padrão que vale memorizar.

Problemas misturados de if / else if / else

Q11. Com x = 75, o que imprime?

int x = 75;
if (x >= 80)      printf("A\n");
else if (x >= 60) printf("B\n");
else if (x >= 40) printf("C\n");
else              printf("D\n");
A
B
C
D
B, C e D imprimem todos

Avaliado de cima para baixo:
1. x >= 80: 75 está abaixo de 80 → falso → segue em frente.
2. x >= 60: verdadeiro → imprime B, a cadeia termina.
O else if e o else restantes nem chegam a ser avaliados. Esse é o ponto principal de uma cadeia else-if.

Q12. Com score = 55, o que imprime?

int score = 55;
if (score >= 50) {
    printf("A\n");
} else if (score >= 90) {
    printf("B\n");
} else {
    printf("C\n");
}
A
B
C
A e B

score >= 50 é verdadeiro, então "A" imprime e a cadeia termina. Mesmo uma nota de 95 imprime "A" — o ramo "B" é inatingível.
Esse é o clássico bug de ordenação de condições: coloque a condição mais restrita primeiro, senão os ramos mais estreitos viram código morto.

Q13. Com x = -5, quantas linhas são impressas?

int x = -5;
if (x > 0) {
    printf("positivo\n");
}
if (x == 0) {
    printf("zero\n");
}
if (x < 0) {
    printf("negativo\n");
}
3 (positivo, zero, negativo)
1 (negativo)
0 (nada)

Esses três ifs são independentes — cada um é avaliado por vez. Só x < 0 é verdadeiro, então exatamente uma linha imprime.
if / else if / else seria melhor? Mesmo resultado aqui, mas ele para de avaliar após o primeiro match. Use if / else if / else sempre que as condições forem mutuamente exclusivas.

Q14. Com day = 0, o que imprime?

int day = 0;
if (day >= 1 && day <= 5) {
    printf("Dia util\n");
} else if (day == 6 || day == 0) {
    printf("Fim de semana\n");
} else {
    printf("Invalido\n");
}
Dia útil
Fim de semana
Inválido
Nada

1. day >= 1 && day <= 5: day = 0 falha no primeiro teste → falso.
2. day == 6 || day == 0: a segunda metade é verdadeira → a expressão inteira é verdadeira → imprime "Fim de semana."
|| (OU) é verdadeiro quando pelo menos um operando é verdadeiro. && (E) precisa de ambos. Fácil de trocar sem querer.

Q15. Qual versão se comporta diferente das outras?

1. Três ifs independentes
if (x > 0) printf("A");
if (x == 0) printf("B");
if (x < 0) printf("C");
2. if-else if-else
if (x > 0) printf("A");
else if (x == 0) printf("B");
else printf("C");
3. if-else aninhado
if (x > 0) printf("A");
else {
  if (x == 0) printf("B");
  else printf("C");
}
4. Estilo de retorno antecipado (dentro de uma função)
if (x > 0) { printf("A"); return; }
if (x == 0) { printf("B"); return; }
printf("C");
Apenas 1
Apenas 2
Apenas 3
Apenas 4
Todas iguais

Só a versão 1 é diferente. As versões 2, 3 e 4 cada uma executa exatamente um ramo, mas a versão 1 sempre avalia os três ifs mesmo depois de um match anterior. Isso importa se as condições tiverem efeitos colaterais, forem caras, ou se x for modificado dentro de um ramo.
A versão 2 (if / else if / else) é geralmente a forma mais clara de dizer "escolha exatamente um."

Q16. Com a=5, b=3, o que imprime?

if (a > b) {
    if (a > 10) {
        printf("grande\n");
    } else {
        printf("medio\n");
    }
} else {
    printf("pequeno\n");
}
grande
médio
pequeno
grande médio

1. a > b externo: 5 > 3 → verdadeiro, então entramos no bloco interno.
2. a > 10 interno: 5 > 10 → falso, então o ramo else roda e imprime "médio."
3. O else externo é pulado inteiramente.
if-else aninhado funciona como uma árvore: o externo decide qual subárvore, e o interno escolhe a folha.

Q17. Com score=85, o que isto faz?

if (score >= 90)
    printf("A\n");
    printf("excelente\n");
else if (score >= 70)
    printf("B\n");
B
excelente B
só excelente
Erro de compilação

Erro de compilação.
Sem chaves, o corpo do if é só printf("A\n");. O próximo printf("excelente\n"); vira uma instrução fora do if.
Agora o else if não tem um if imediatamente antes dele — há uma instrução sobrando no meio — então o compilador reclama com "else sem if anterior."
Lição: sempre envolva corpos de múltiplas instruções em { }.

Compartilhe este artigo
Compartilhar no X (Twitter) Compartilhar no Facebook