while e do-while
Esta aula explora as estruturas de repetição while e do-while em C, destacando suas diferenças, condições de parada, loops infinitos e orientações sobre quando utilizar cada uma. Inclui exemplos práticos e exercícios para fixação.
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
forquando o número de iterações é conhecido; usewhileoudo-whilepara 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
- cppreference.com: while loop
- cppreference.com: do-while loop
- GNU C Manual: Loops
- Microsoft C while statement
- Microsoft C do-while statement
- TutorialsPoint C Loops
Exercícios
-
Escreva um programa em C que use um loop
whilepara 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; } -
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; } -
Crie um programa que solicite ao usuário que digite um número positivo. Use um loop
do-whilepara 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; } -
Escreva um loop
whileinfinito que imprima "Executando..." a cada iteração e pare quando a variávelcontadoratingir 5. Usebreakpara sair.✓ Resposta:#include <stdio.h> int main() { int contador = 0; while (1) { printf("Executando...\n"); contador++; if (contador == 5) { break; } } return 0; } -
Explique em um comentário no código a diferença entre
whileedo-whilee dê um exemplo onde odo-whileseria mais adequado que owhile.✓ 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; }