Laços dirigidos por uma condição em vez de um contador. while pré-teste e do-while pós-teste.
while (cond) { ... } roda enquanto a condição é verdadeirado { ... } while (cond); roda pelo menos uma vezdo-whilewhile (1) + break para sairwhile é 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 }
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
while encaixa melhor que for. O laço repete: verifica condição → executa corpo → verifica condição → …n <= 100{ ... }}, volta ao passo 1for (int i = 0; i < 5; i++) { printf("%d\n", i); }
int i = 0; while (i < 5) { printf("%d\n", i); i++; }
for sempre que a contagem de iterações for fixa.| Situação | Melhor escolha | Exemplo |
|---|---|---|
| Contagem de iterações conhecida | for | percorrer array 0..N-1 |
| Parar numa condição (contagem desconhecida) | while | ler até o usuário digitar "q" |
| Precisa rodar pelo menos uma vez | do-while | pedir entrada, pedir de novo se inválida |
Laço infinito (saída via break) | while(1) / for(;;) | um laço de eventos ou principal |
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á.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 (cond) { corpo; // 0 vezes se cond for falsa }
do { corpo; // sempre 1+ vezes } while (cond);
} while (cond); tem que terminar com ; ou o compilador rejeita. Essa peculiaridade é exclusiva do do-while.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);
int i = 10; while (i < 5) { printf("x"); }
int i = 10; do { printf("x"); } while (i < 5);
while / do-while é um laço infinito — esquecer de mudar a variável da condição dentro do corpo.int i = 0; while (i < 5) { printf("%d\n", i); // esqueceu i++! }
i nunca muda, então i < 5 permanece verdadeiro — um laço infinito que imprime 0 para sempre.
for torna isso mais difícil de esquecer, já que a cláusula de update está embutida na sintaxe.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); }
break ou return é a saída planejada.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.
Ctrl + C para parar um programa de terminal. No Visual Studio, clique em "Parar depuração."for e confirme que obtém a mesma saídan = n * 3 e observe a contagem de passosdo-whilewhile(1) + break para ler números até ver 0Teste seu entendimento.
while(1) faz?A condição é sempre 1 (verdadeira), então ele roda para sempre a menos que um break ou return tire você.
do-while e while?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.
int i = 10; while (i < 5) { printf("x"); i++; }
while é pré-teste. Com i=10, i<5 é falso imediatamente, então o corpo roda zero vezes.
do-while?int i = 10; do { printf("x"); i++; } while (i < 5);
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".
int i = 0; while (i < 5) { printf("%d\n", i); }
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.
do-while?{};} while (cond); precisa do ; final ou o compilador rejeita. Essa regra é exclusiva do do-while.