Publicidade

Aula 12: Laços while e do-while

Laços dirigidos por uma condição em vez de um contador. while pré-teste e do-while pós-teste.

📖 O que aprender nesta página
✅ Essencial saber
  • while (cond) { ... } roda enquanto a condição é verdadeira
  • do { ... } while (cond); roda pelo menos uma vez
  • Não esqueça o ponto e vírgula final no do-while
⭐ Leia se tiver tempo
  • Laço infinito while (1) + break para sair
  • Esquecer de atualizar a variável do laço causa laços infinitos
  • Mecanicamente, for e while são intercambiáveis

while — repete enquanto a condição for verdadeira

while é a escolha certa quando você não sabe a contagem de iterações de antemão. A ideia é "continue enquanto esta condição valer" — igual à palavra "enquanto".
while (condicao) {
    // roda repetidamente enquanto a condicao for verdadeira
}

Exemplo: quantas duplicações para passar de 100?

int n = 1;
int count = 0;
while (n <= 100) {
    n = n * 2;
    count++;
}
printf("%d passos para atingir %d\n", count, n);
// -> 7 passos para atingir 128
Você não consegue prever a contagem de iterações aqui, então while encaixa melhor que for. O laço repete: verifica condição → executa corpo → verifica condição → …

A ordem de avaliação (pré-teste)

1. Verifica n <= 100
2. Se verdadeiro, roda o corpo { ... }
3. No }, volta ao passo 1
4. Quando a condição é falsa, o laço termina
Ideia-chave: como o teste acontece primeiro, se a condição já for falsa, o corpo roda zero vezes.

for vs while — qual eu uso?

Mecanicamente, for e while podem ser reescritos um como o outro. Os dois funcionam — escolha o que expressa sua intenção com mais clareza.

Mesma tarefa, duas formas

for (baseado em contagem)
for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
}
while (mesma lógica)
int i = 0;
while (i < 5) {
    printf("%d\n", i);
    i++;
}
for coloca "init / condição / update" direto no cabeçalho, então use for sempre que a contagem de iterações for fixa.

Quando usar cada um

SituaçãoMelhor escolhaExemplo
Contagem de iterações conhecidaforpercorrer array 0..N-1
Parar numa condição (contagem desconhecida)whileler até o usuário digitar "q"
Precisa rodar pelo menos uma vezdo-whilepedir entrada, pedir de novo se inválida
Laço infinito (saída via break)while(1) / for(;;)um laço de eventos ou principal
⚠️ Erro comum com while: esquecer de atualizar a variável da condição dentro do corpo. O for força você a colocar o update no cabeçalho, então essa classe de bug é mais rara lá.

do-while — garantido para rodar pelo menos uma vez

while verifica a condição antes do corpo (pré-teste); do-while verifica depois do corpo (pós-teste). Por isso o corpo de um do-while sempre roda pelo menos uma vez.
while (pré-teste)
while (cond) {
    corpo;  // 0 vezes se cond for falsa
}
Se a condição é falsa desde o início, o corpo roda zero vezes.
do-while (pós-teste)
do {
    corpo;  // sempre 1+ vezes
} while (cond);
Corpo primeiro, depois verifica — uma iteração está sempre garantida.
⚠️ Não esqueça o ponto e vírgula final! } while (cond); tem que terminar com ; ou o compilador rejeita. Essa peculiaridade é exclusiva do do-while.

Uso típico: pedir e repedir até a entrada ser válida

"Digite 1–3, e se a entrada for inválida continue perguntando" — você precisa mostrar o prompt pelo menos uma vez, então do-while é uma escolha natural.
int choice;
do {
    printf("Escolha 1-3 > ");
    scanf("%d", &choice);
    if (choice < 1 || choice > 3)
        printf("Entrada invalida\n");
} while (choice < 1 || choice > 3);
printf("Voce escolheu %d\n", choice);

while vs do-while — caso de zero iterações

while com condição falsa desde o início
int i = 10;
while (i < 5) {
    printf("x");
}
0 iterações (nada impresso)
do-while com condição falsa desde o início
int i = 10;
do {
    printf("x");
} while (i < 5);
1 iteração (imprime um "x")

Armadilhas de laço infinito — esquecer de atualizar

O bug mais comum em while / do-while é um laço infinito — esquecer de mudar a variável da condição dentro do corpo.
🔴 Armadilha 1: update do contador esquecido
int i = 0;
while (i < 5) {
    printf("%d\n", i);
    // esqueceu i++!
}
O que acontece: i nunca muda, então i < 5 permanece verdadeiro — um laço infinito que imprime 0 para sempre.
Correção: sempre verifique se o corpo do while tem algo movendo o laço rumo à sua saída. for torna isso mais difícil de esquecer, já que a cláusula de update está embutida na sintaxe.
💡 Laço infinito intencional + break
Quando você quer "continue rodando, e saia em algum evento", use while (1) com break para sair.
while (1) {          // 1 eh sempre verdadeiro -> infinito
    int n;
    scanf("%d", &n);
    if (n == 0) break;  // sai no 0
    printf("Recebido: %d\n", n);
}
Isso é comum em laços de eventos e programas interativos, onde break ou return é a saída planejada.
⚠️ do-while compartilha o mesmo risco
int choice;
do {
    printf("1-3 > ");
    // esqueceu o scanf! choice fica nao inicializado
} while (choice < 1 || choice > 3);
choice nunca muda, então dependendo do seu valor inicial o laço pode rodar para sempre. Garanta que toda iteração atualize a variável que a condição testa.
Se você ficar preso em um: pressione Ctrl + C para parar um programa de terminal. No Visual Studio, clique em "Parar depuração."

Experimente — laço while

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

Aulas Relacionadas

Laços
Aula 11: Laço for
A forma contada de fazer iterações.
Depuração
Técnicas de Depuração
Dicas práticas, incluindo como parar um laço infinito.
Arrays
Arrays
Combine laços e arrays para processamento de dados real.
← Anterior
Aula 11: Laço for
Próxima →
Aula 20: Arrays

Teste de Revisão

Teste seu entendimento.

Q1. O que while(1) faz?

Roda uma vez
Laço infinito
Erro de compilação

A condição é sempre 1 (verdadeira), então ele roda para sempre a menos que um break ou return tire você.

Q2. Diferença entre do-while e while?

Nenhuma diferença
do-while roda pelo menos uma vez
do-while é mais rápido

do-while verifica a condição depois do corpo, então o corpo sempre roda pelo menos uma vez. while verifica antes, então o corpo pode rodar zero vezes.

Q3. Quantas vezes isto imprime?

int i = 10;
while (i < 5) {
    printf("x");
    i++;
}
0 (nada)
Uma vez
5 vezes
Laço infinito

while é pré-teste. Com i=10, i<5 é falso imediatamente, então o corpo roda zero vezes.

Q4. Mesma condição mas como do-while?

int i = 10;
do {
    printf("x");
    i++;
} while (i < 5);
0
Uma vez
5 vezes
Laço infinito

do-while é pós-teste: roda uma vez, depois verifica. Depois da primeira iteração i=11, e 11 < 5 é falso, então o laço termina. Uma iteração — o clássico comportamento "uma a mais que o while".

Q5. O que este código faz?

int i = 0;
while (i < 5) {
    printf("%d\n", i);
}
Imprime 0..4
Imprime 0 uma vez
Imprime 0 para sempre (laço infinito)
Erro de compilação

i++ está faltando. i fica em 0 e a condição nunca fica falsa — um laço infinito que imprime 0. O bug de while mais comum. Ctrl+C para parar.

Q6. Qual detalhe de sintaxe você não pode esquecer no do-while?

Parênteses ao redor da condição
Chaves {}
O ponto e vírgula final ;

} while (cond); precisa do ; final ou o compilador rejeita. Essa regra é exclusiva do do-while.

Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook