Carregando
0x50Lição 6 de 20

Tomando decisões: if e switch

Faça o seu programa escolher o que fazer com if, else, operadores lógicos e switch.

12 min Questionário com 6 perguntas 2 exercícios de código
Ao final desta lição, você saberá
  • Ramificar com if, else if e else
  • Combinar condições com &&, || e !
  • Usar switch para muitos casos fixos - e lembrar do break

Até aqui, os programas rodaram todas as linhas de cima para baixo. O controle de fluxo deixa um programa escolher quais linhas rodam. A ferramenta mais simples é o if: rodar um bloco só quando uma condição é verdadeira.

if, else if, else

grade.c
1#include <stdio.h>
2
3int main(void) {
4    int score = 83;
5
6    if (score >= 90) {
7        printf("A\n");
8    } else if (score >= 80) {
9        printf("B\n");
10    } else if (score >= 70) {
11        printf("C\n");
12    } else {
13        printf("Keep practicing\n");
14    }
15    return 0;
16}
Saída
B

As condições são verificadas em ordem, e só o primeiro ramo verdadeiro roda. É por isso que score >= 80 não precisa também de score < 90: se a nota fosse 90 ou mais, o primeiro ramo já teria rodado. Experimente mudar score e rodar de novo.

O que conta como verdadeiro

O C não tem um tipo booleano especial no seu núcleo: zero é falso, e qualquer valor diferente de zero é verdadeiro. As comparações produzem 1 ou 0. Desde o C99, você pode fazer #include <stdbool.h> para ter bool, true e false, que deixam a intenção mais clara - use-os.

Combinando condições

  • a && b é verdadeiro quando os dois são verdadeiros.
  • a || b é verdadeiro quando pelo menos um é verdadeiro.
  • !a inverte verdadeiro e falso.

Tanto && quanto || fazem curto-circuito: eles param assim que a resposta é conhecida. Em count > 0 && total / count > 10, a divisão nunca acontece quando count é 0 - um jeito prático de se proteger contra divisão por zero.

ticket.c
1#include <stdio.h>
2#include <stdbool.h>
3
4int main(void) {
5    int age = 15;
6    bool with_adult = true;
7
8    if (age >= 18 || with_adult) {
9        printf("Entry allowed\n");
10    }
11    if (age >= 13 && age <= 19) {
12        printf("Teen ticket\n");
13    }
14    return 0;
15}
Saída
Entry allowed
Teen ticket

switch

Quando você compara um inteiro (ou um char) com muitos valores fixos, o switch é mais limpo do que uma longa cadeia de if:

menu.c
1#include <stdio.h>
2
3int main(void) {
4    char choice = 's';
5
6    switch (choice) {
7        case 'n':
8            printf("New game\n");
9            break;
10        case 'l':
11            printf("Load game\n");
12            break;
13        case 's':
14            printf("Settings\n");
15            break;
16        default:
17            printf("Unknown option\n");
18            break;
19    }
20    return 0;
21}
Saída
Settings

Cada rótulo case marca onde a execução começa. Sem break, ela continua para o próximo caso - o chamado fall-through. De vez em quando é isso que você quer (vários casos compartilhando um bloco), mas esquecer um break é um bug muito comum. O default roda quando nenhum caso corresponde.

Principais conclusões

  • if / else if / else verifica as condições em ordem e roda só o primeiro ramo verdadeiro.

  • Zero é falso, qualquer outra coisa é verdadeira. && e || fazem curto-circuito. Escreva intervalos como x > 0 && x < 10.

  • O switch pula para um case correspondente; termine cada caso com break, a menos que você realmente queira o fall-through.

Quiz da aula

6 perguntas · aprovação com 5 acertos · até 50 XP

Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.

Pratique: escreva código em C

Estes exercícios rodam de verdade. Escreva o programa, clique em “Executar testes” e leia o que o compilador informa: aprender a ler as mensagens do compilador é metade do aprendizado de C.

Exercício 1

FizzBuzz para um número

+25 XP

Leia um inteiro. Imprima FizzBuzz se ele for divisível por 3 e por 5, Fizz se só por 3, Buzz se só por 5 e, nos outros casos, o próprio número.

  • 15 imprime FizzBuzz
  • 9 imprime Fizz
  • 10 imprime Buzz
  • 7 imprime 7
main.c
Carregando editor…

Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.

Exercício 2

Calculadora minúscula

+25 XP

Leia uma expressão como 12 * 3 - um número, um caractere de operador e um número - e imprima o resultado. Suporte +, -, * e / usando um switch. Para divisão por zero, imprima Error: division by zero. Para qualquer outro operador, imprima Error: unknown operator.

Leia com scanf("%d %c %d", &a, &op, &b). Divisão inteira não tem problema.

  • 12 * 3
  • 20 / 6
  • 5 / 0
  • 2 ^ 3
main.c
Carregando editor…

Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.

Dúvidas sobre esta lição

Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.

Carregando publicações…