Aprenda a usar laços for e while em C com exemplos visuais passo a passo.
for (init; cond; update) { ... }while (cond) { ... } roda enquanto cond é verdadeirobreak sai; continue pula para a próxima iteraçãodo-while roda pelo menos uma vezfor (;;) / while (1)#include <stdio.h> int main(void) { printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n"); printf("5\n"); return 0; }
printf("1\n"); printf("2\n"); ... printf("100\n"); para 100 linhas? E se a especificação mudasse para "apenas múltiplos de 3", você teria que reescrever tudo.#include <stdio.h> int main(void) { for (int i = 1; i <= 5; i++) { printf("%d\n", i); } return 0; }
5 para 100. Até 10.000 iterações cabem na mesma quantidade de código.// Sem laco: somar manualmente cada numero int sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; // Com laco int sum = 0; for (int i = 1; i <= 10; i++) sum += i;
for (int i = 0; i < 5; i++) { printf("i = %d\n", i); }
for ( A ; B ; C ), cada uma das três seções separadas por ponto e vírgula tem seu próprio papel.int i = 0i < 5i++for (int i = 0; i < 3; i++) printf("%d ", i);)printf("0 ") → C: i++ → i=1printf("1 ") → C: i++ → i=2printf("2 ") → C: i++ → i=3int i = 0; é declarado fora do for.break.i += 1 ao fim do bloco.for (;;) é o idioma clássico de laço infinito (equivalente a while (1)).for (int i = 0; i < N; i++) { ... }
for (int i = 1; i <= N; i++) { ... }
for (int i = N; i >= 0; i--) { ... }
for (int i = 0; i < N; i += 2) { ... }
for (;;))for (;;) {
...
if (condicao_saida) break;
}
break — comum para laços de menu e laços de eventos.| Nome | Tipo | Valor |
|---|
for (int i=0; i<10; i++) { if (i == 5) break; printf("%d ", i); } // Saida: 0 1 2 3 4
for (int i=0; i<5; i++) { if (i == 2) continue; printf("%d ", i); } // Saida: 0 1 3 4 (pula 2)
break e continue afetam apenas o laço mais interno. Um break dentro de um laço aninhado não sai do externo.continue significa "pule o resto desta iteração e vá para a próxima." Diferente do break, o laço não sai. Vamos rastrear passo a passo.for (int i = 0; i < 5; i++) { if (i == 2) continue; // ← quando i==2, pula o resto printf("%d ", i); // nao e alcancado apos continue }
0 → i++ faz i=11 → i++ faz i=23 4 → i=5 encerra o laço
continue, a cláusula de update do for i++ ainda roda. É por isso que i=2 é pulado mas i=3 vem em seguida.
| break | continue | |
|---|---|---|
| Laço inteiro | Sai (terminou) | Continua (próxima iteração) |
| Resto desta iteração | Pulado | Pulado |
Update do for i++ | Não roda | Roda |
| Quando usar | "Terminei de procurar" | "pule só este elemento" |
continue dentro de um while pode causar laço infinitocontinue pode pular isso. É uma armadilha clássica de laço infinito.
int i = 0; while (i < 5) { if (i == 2) continue; // ❌ nunca alcanca i++ → preso em i=2 pra sempre printf("%d ", i); i++; }
if (i == 2) { i++; continue; } // ✅ seguro
continue ou com um if. Qual lê melhor depende da situação.
for (int i=0; i<n; i++) { if (arr[i] < 0) continue; // pula negativos if (arr[i] == 0) continue; // pula zeros tambem // processamento principal longo para positivos... process(arr[i]); total += arr[i] * 2; }
for (int i=0; i<n; i++) { if (arr[i] > 0) { // inverter e envolver process(arr[i]); total += arr[i] * 2; } }
ifcontinue (estilo guard-clause)return antecipado em funções — veja Instrução if.
break e continue fazem sentidodo-while e veja o comportamento "garante uma vez"Teste seu entendimento desta aula!
for (int i=0; i<5; i++) executa?i assume os cinco valores 0, 1, 2, 3, 4, então o corpo roda 5 vezes.
for (int i=10; i>0; i--) executa?i assume os dez valores 10, 9, 8, …, 1, então o corpo roda 10 vezes. A condição i > 0 significa que o corpo nunca roda quando i=0.
for (;;) { ... } faz?Quando as três partes (init / condição / update) são omitidas, a condição ausente é tratada como sempre verdadeira, então o laço roda para sempre. Use break ou return para sair.
for (int i = 0; i < 5; i++) { if (i == 3) continue; printf("%d ", i); }
continue pula o resto da iteração atual e avança. O printf só é pulado quando i=3, então a saída é 0 1 2 4.
Com break, o laço sairia totalmente naquele ponto, dando 0 1 2 — não confunda os dois.