Controle de Fluxo

Condicionais (if/else, switch) e loops (for, while) para controlar a execução.

Até agora, seu código executa linha por linha, de cima para baixo. Mas programas reais precisam tomar decisões e repetir ações. É aqui que entram as estruturas de controle.

Conforme Linguagem C Completa e Descomplicada (André Backes): “Os comandos de controle condicional e de repetição completam a apresentação da estrutura básica da linguagem.”

Operadores de Comparação

Antes de controlar fluxo, você precisa comparar valores:

OperadorSignificadoExemplo
==Igual ax == 5
!=Diferente dex != 0
<Menor quex < 10
>Maior quex > 0
<=Menor ou igualx <= 100
>=Maior ou igualx >= 18

Erro Clássico

Não confunda = (atribuição) com == (comparação)! c if (x = 5) // ERRADO: Isso ATRIBUI 5 a x, não compara! if (x == 5) // CERTO: Isso COMPARA x com 5

Operadores Lógicos

Combine condições com lógica booleana:

OperadorSignificadoExemplo
&&E (AND)x > 0 && x < 100
||OU (OR)x == 0 || x == 1
!NÃO (NOT)!encontrado

Condicional: if e else

Execute código apenas se uma condição for verdadeira:

int idade = 17;

if (idade >= 18) {
    printf("Você é maior de idade.\n");
} else {
    printf("Você é menor de idade.\n");
}

Múltiplas Condições: else if

int nota = 75;

if (nota >= 90) {
    printf("Conceito A\n");
} else if (nota >= 70) {
    printf("Conceito B\n");
} else if (nota >= 50) {
    printf("Conceito C\n");
} else {
    printf("Reprovado\n");
}

Operador Ternário (Atalho)

Para condições simples, existe um atalho em uma linha:

int idade = 20;
char *status = (idade >= 18) ? "Adulto" : "Menor";
printf("%s\n", status);

Seleção Múltipla: switch

Quando você precisa comparar uma variável com vários valores fixos, o switch é mais elegante que muitos else if:

char opcao;
printf("Digite sua opção (a/b/c): ");
scanf(" %c", &opcao);

switch (opcao) {
    case 'a':
        printf("Você escolheu A\n");
        break;
    case 'b':
        printf("Você escolheu B\n");
        break;
    case 'c':
        printf("Você escolheu C\n");
        break;
    default:
        printf("Opção inválida!\n");
}

O break é essencial!

Sem o break, a execução “cai” para o próximo case: c case 'a': printf("A\n"); // Sem break aqui... case 'b': printf("B\n"); // Isso também executa se opção == 'a'!

Repetição: while

Repete enquanto a condição for verdadeira:

int contador = 1;

while (contador <= 5) {
    printf("Contagem: %d\n", contador);
    contador++;
}

Saída:

Contagem: 1
Contagem: 2
Contagem: 3
Contagem: 4
Contagem: 5

Repetição: do-while

Parecido com while, mas executa pelo menos uma vez antes de verificar a condição:

int numero;

do {
    printf("Digite um número positivo: ");
    scanf("%d", &numero);
} while (numero <= 0);  // Repete se inválido

printf("Você digitou: %d\n", numero);

Repetição: for

Ideal quando você sabe quantas vezes repetir:

for (int i = 0; i < 5; i++) {
    printf("Iteração %d\n", i);
}

Estrutura do for:

for (inicialização; condição; incremento) {
    // corpo do loop
}
ParteSignificado
int i = 0Executado UMA vez, antes do loop
i < 5Testado ANTES de cada iteração
i++Executado DEPOIS de cada iteração

Iterando Arrays

int notas[] = {90, 85, 78, 92, 88};
int soma = 0;

for (int i = 0; i < 5; i++) {
    soma += notas[i];
}

printf("Média: %.1f\n", soma / 5.0);

Controlando Loops: break e continue

break: Sai do loop imediatamente

for (int i = 1; i <= 100; i++) {
    if (i == 5) {
        printf("Encontrei o 5! Parando.\n");
        break;  // Sai do loop
    }
    printf("%d\n", i);
}
// Imprime: 1, 2, 3, 4, "Encontrei o 5! Parando."

continue: Pula para próxima iteração

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;  // Pula o 3
    }
    printf("%d\n", i);
}
// Imprime: 1, 2, 4, 5 (sem o 3)

Exemplo Prático: Validação de Senha

#include <stdio.h>

int main() {
    int senha_correta = 1234;
    int tentativas = 3;
    int senha;

    while (tentativas > 0) {
        printf("Digite a senha (%d tentativas restantes): ", tentativas);
        scanf("%d", &senha);

        if (senha == senha_correta) {
            printf("Acesso liberado!\n");
            break;
        } else {
            printf("Senha incorreta.\n");
            tentativas--;
        }
    }

    if (tentativas == 0) {
        printf("Acesso bloqueado!\n");
    }

    return 0;
}

Próximo Passo

Com variáveis e controle de fluxo, você já consegue escrever programas úteis. Agora vou ensinar a organizar código em funções para não repetir lógica.

Progresso do Tópico