As estruturas de repetição são fundamentais na programação em C, permitindo executar um bloco de código várias vezes com base em uma condição. Nesta aula, vamos nos aprofundar nas estruturas while e do-while, compreendendo suas particularidades, diferenças e melhores práticas de uso. Ambas são amplamente utilizadas, mas cada uma tem seu cenário ideal.

Enquanto o while testa a condição antes de executar o bloco, o do-while garante que o bloco seja executado ao menos uma vez, pois testa a condição ao final. Essa diferença sutil pode impactar a lógica do programa, especialmente em situações onde a primeira execução é necessária independentemente da condição.

Diferenças

A principal diferença entre while e do-while está no momento da verificação da condição de continuação. No while, a condição é avaliada antes de cada iteração; se for falsa desde o início, o bloco nunca será executado. Já no do-while, o bloco é executado primeiro e a condição é verificada depois, garantindo que o corpo do loop seja executado pelo menos uma vez.

Outra diferença é a sintaxe: no do-while é obrigatório o uso de ponto e vírgula após a condição, o que é uma fonte comum de erros para iniciantes. Além disso, semanticamente, o while é mais adequado quando não sabemos se a condição será satisfeita inicialmente, enquanto o do-while é útil quando precisamos que uma ação ocorra antes da verificação.

Exemplo de while:

#include <stdio.h>

int main() {
    int contador = 0;
    while (contador < 5) {
        printf("%d ", contador);
        contador++;
    }
    printf("\n");
    return 0;
}

Saída: 0 1 2 3 4

Exemplo de do-while:

#include <stdio.h>

int main() {
    int contador = 0;
    do {
        printf("%d ", contador);
        contador++;
    } while (contador < 5);
    printf("\n");
    return 0;
}

Saída: 0 1 2 3 4

Se a condição inicial for falsa (por exemplo, contador = 10), o while não executaria nenhuma vez, enquanto o do-while executaria uma vez, imprimindo 10.

Condições

As condições nos loops while e do-while são expressões que retornam um valor booleano (verdadeiro ou falso). Em C, qualquer valor diferente de zero é considerado verdadeiro, e zero é falso. A condição pode ser simples (como i < 10) ou composta (usando operadores lógicos &&, ||, !).

É importante que a condição se torne falsa em algum momento, caso contrário teremos um loop infinito. A variável de controle deve ser atualizada dentro do bloco para que a condição eventualmente falhe. Exemplo com condição composta:

#include <stdio.h>

int main() {
    int i = 0, j = 10;
    while (i < j) {
        printf("i=%d, j=%d\n", i, j);
        i++;
        j--;
    }
    return 0;
}

Nesse exemplo, a condição i < j se torna falsa quando i ultrapassa ou iguala j.

Loops infinitos

Um loop infinito ocorre quando a condição nunca se torna falsa. Isso pode ser intencional ou um erro. Exemplo de loop infinito acidental:

int x = 0;
while (x < 10) {
    printf("%d\n", x);
    // esqueci de incrementar x!
}

Para criar um loop infinito intencional, podemos usar while(1) ou for(;;). Isso é útil em programas que rodam continuamente, como servidores, até que uma condição de saída seja acionada (exemplo: interrupção via break).

#include <stdio.h>

int main() {
    while (1) {
        char opcao;
        printf("Digite 's' para sair: ");
        scanf(" %c", &opcao);
        if (opcao == 's') {
            break;
        }
        printf("Você digitou %c\n", opcao);
    }
    return 0;
}

No do-while, um loop infinito pode ser criado com do { ... } while(1);.

Quando usar cada um

Use while quando a condição de parada pode ser avaliada antes da primeira execução, e você não deseja executar o bloco se a condição for falsa. Exemplos: ler dados até que uma condição seja atendida (como digitar um número negativo), processar enquanto uma fila não estiver vazia, etc.

Use do-while quando o bloco precisa ser executado pelo menos uma vez, independentemente da condição. Exemplos: exibir um menu e depois perguntar se o usuário deseja continuar, validação de entrada que exige ao menos uma tentativa, etc.

Exemplo prático: validação de entrada com do-while

#include <stdio.h>

int main() {
    int numero;
    do {
        printf("Digite um número entre 1 e 10: ");
        scanf("%d", &numero);
    } while (numero < 1 || numero > 10);
    printf("Número válido: %d\n", numero);
    return 0;
}

Aqui, o bloco é executado uma vez antes de verificar a condição, garantindo que o usuário sempre veja a mensagem pelo menos uma vez.

Boas práticas

  • Sempre inicialize as variáveis de controle antes do loop.
  • Evite modificar a variável de controle dentro do bloco de forma imprevisível.
  • Prefira for quando o número de iterações é conhecido; use while ou do-while para repetições baseadas em condições.
  • Em loops infinitos intencionais, forneça sempre uma forma de sair (break, return, etc.).
  • Cuidado com ponto e vírgula após o while — um ; após a condição pode criar um loop vazio ou comportamento inesperado.

Referências

Exercícios

  1. Escreva um programa em C que use um loop while para imprimir os números pares de 0 a 20 (inclusive).

    ✓ Resposta:
    #include <stdio.h>
    
    int main() {
        int i = 0;
        while (i <= 20) {
            if (i % 2 == 0) {
                printf("%d ", i);
            }
            i++;
        }
        printf("\n");
        return 0;
    }
    
  2. Reescreva o programa acima usando um loop do-while.

    ✓ Resposta:
    #include <stdio.h>
    
    int main() {
        int i = 0;
        do {
            if (i % 2 == 0) {
                printf("%d ", i);
            }
            i++;
        } while (i <= 20);
        printf("\n");
        return 0;
    }
    
  3. Crie um programa que solicite ao usuário que digite um número positivo. Use um loop do-while para continuar pedindo até que o número digitado seja maior que zero.

    ✓ Resposta:
    #include <stdio.h>
    
    int main() {
        int numero;
        do {
            printf("Digite um número positivo: ");
            scanf("%d", &numero);
        } while (numero <= 0);
        printf("Número positivo: %d\n", numero);
        return 0;
    }
    
  4. Escreva um loop while infinito que imprima "Executando..." a cada iteração e pare quando a variável contador atingir 5. Use break para sair.

    ✓ Resposta:
    #include <stdio.h>
    
    int main() {
        int contador = 0;
        while (1) {
            printf("Executando...\n");
            contador++;
            if (contador == 5) {
                break;
            }
        }
        return 0;
    }
    
  5. Explique em um comentário no código a diferença entre while e do-while e dê um exemplo onde o do-while seria mais adequado que o while.

    ✓ Resposta:
    #include <stdio.h>
    
    int main() {
        /* Diferença: while testa a condição antes de executar o bloco;
           do-while executa o bloco ao menos uma vez e depois testa.
           Exemplo onde do-while é melhor: validação de entrada que
           precisa ser executada pelo menos uma vez. */
        int numero;
        do {
            printf("Digite um número entre 1 e 10: ");
            scanf("%d", &numero);
        } while (numero < 1 || numero > 10);
        printf("Número válido: %d\n", numero);
        return 0;
    }