Repetição com número de iterações conhecido — sintaxe, variações e usos clássicos
Antes de ver a sintaxe do for, vamos entender o que um loop faz de verdade
olhando para um problema simples: calcular a média de 5 notas.
{7, 5, 6, 8, 9},
calcule a soma de todos os valores e depois divida pelo número de notas para obter a média.soma = soma + nota[i]soma, somamos com
o próximo elemento do vetor e guardamos o resultado de volta em soma.
É como ir somando valores numa calculadora, um de cada vez.
Veja como a variável soma evolui a cada iteração do loop:
| Iteração (loop) | i | nota[i] | soma (antes) | Operação | soma (depois) |
|---|---|---|---|---|---|
| Início | — | — | — | soma = 0 (inicialização) |
0 |
| Loop 1 | 0 | 7 | 0 | soma = 0 + 7 |
7 |
| Loop 2 | 1 | 5 | 7 | soma = 7 + 5 |
12 |
| Loop 3 | 2 | 6 | 12 | soma = 12 + 6 |
18 |
| Loop 4 | 3 | 8 | 18 | soma = 18 + 8 |
26 |
| Loop 5 | 4 | 9 | 26 | soma = 26 + 9 |
35 |
| Após o loop | — | — | 35 | media = 35 / 5 |
7.0 |
soma começa em zero — obrigatoriamente —
antes do loop. Se começasse com qualquer outro valor, o resultado final estaria errado.
Após as 5 iterações, saímos do loop com soma = 35 e calculamos
media = 35 / 5 = 7.0 com uma única instrução fora do loop.
Dividir dentro do loop seria um erro clássico de lógica.
#include <stdio.h>
int main() {
float notas[] = {7, 5, 6, 8, 9}; // vetor com as 5 notas
int n = 5; // número de elementos
float soma = 0; // inicialização obrigatória!
float media;
for (int i = 0; i < n; i++) {
soma = soma + notas[i]; // acumula: soma = soma + nota[i]
}
// saiu do loop — soma = 35
media = soma / n; // divide UMA VEZ, fora do loop
printf("Soma: %.0f\n", soma);
printf("Média: %.1f\n", media);
return 0;
}
soma = 0), acumule dentro do loop (soma = soma + x),
use o resultado depois do loop. Este é um dos padrões mais recorrentes em
programação e reaparecerá em algoritmos de busca, ordenação e estatística.
Estruturas de repetição — também chamadas de loops — permitem executar um bloco de código múltiplas vezes sem precisar escrevê-lo repetidamente. São fundamentais para processar coleções de dados, automatizar cálculos iterativos e controlar fluxos que dependem de condições.
for — usado quando o número de iterações é conhecido antecipadamente (esta aula)while — usado quando o número de iterações depende de uma condição em tempo de execução (Aula 11)do-while — garante que o bloco execute pelo menos uma vez, pois a condição é verificada após a primeira iteração (Aula 11)O for é a estrutura de repetição mais compacta do C — ela concentra em uma única linha os três elementos necessários para controlar o loop: inicialização, condição e incremento.
for (inicialização; condição; incremento) {
// bloco executado enquanto a condição for verdadeira
}
#include <stdio.h>
int main() {
int i;
// Imprime números de 1 a 5
for (i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
return 0;
}
1 2 3 4 5
Passo a passo da execução:
| Iteração | Inicialização | Condição (i <= 5) | Bloco | Incremento |
|---|---|---|---|---|
| — | i = 1 | 1 <= 5 → verdadeiro | imprime 1 | i → 2 |
| 2ª | — | 2 <= 5 → verdadeiro | imprime 2 | i → 3 |
| 3ª | — | 3 <= 5 → verdadeiro | imprime 3 | i → 4 |
| 4ª | — | 4 <= 5 → verdadeiro | imprime 4 | i → 5 |
| 5ª | — | 5 <= 5 → verdadeiro | imprime 5 | i → 6 |
| — | — | 6 <= 5 → falso | — | loop termina |
#include <stdio.h>
int main() {
int i;
for (i = 10; i >= 1; i--) { // decrementa em vez de incrementar
printf("%d ", i);
}
printf("\n");
return 0;
}
10 9 8 7 6 5 4 3 2 1
#include <stdio.h>
int main() {
int i;
// Apenas números pares de 0 a 20
for (i = 0; i <= 20; i += 2) {
printf("%d ", i);
}
printf("\n");
// Potências de 2
for (i = 1; i <= 1024; i *= 2) {
printf("%d ", i);
}
printf("\n");
return 0;
}
0 2 4 6 8 10 12 14 16 18 20
1 2 4 8 16 32 64 128 256 512 1024
A partir do padrão C99, é possível declarar a variável de controle diretamente na inicialização do for, limitando seu escopo ao próprio loop:
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) { // 'i' só existe dentro deste for
printf("%d ", i);
}
printf("\n");
// printf("%d", i); ← erro! 'i' não existe aqui fora
return 0;
}
for (for (int i = ...)) é a prática moderna preferida — ela deixa claro que i é exclusiva daquele loop e evita uso acidental fora dele. O Code::Blocks com MinGW suporta isso com C99 ativado.
A inicialização e o incremento aceitam múltiplas expressões separadas por vírgula:
#include <stdio.h>
int main() {
int i, j;
for (i = 0, j = 10; i < j; i++, j--) {
printf("i=%d j=%d\n", i, j);
}
return 0;
}
i=0 j=10
i=1 j=9
i=2 j=8
i=3 j=7
i=4 j=6
Um for pode estar dentro de outro for. Para cada iteração do loop externo, o loop interno é executado completamente. Isso é essencial para trabalhar com matrizes, tabelas e combinações.
#include <stdio.h>
int main() {
int i, j;
// Tabuada de multiplicação (3x5)
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 5; j++) {
printf("%3d", i * j); // %3d: 3 caracteres de largura
}
printf("\n"); // quebra de linha após cada linha da tabuada
}
return 0;
}
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
n iterações cada realizam n² operações no total. Loops triplos aninhados chegam a n³. Em cálculos científicos — como integrais numéricas sobre grades tridimensionais — esse crescimento é uma consideração importante de desempenho.
#include <stdio.h>
int main() {
int i, j;
int linhas = 5;
for (i = 1; i <= linhas; i++) {
for (j = 1; j <= i; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
*
* *
* * *
* * * *
* * * * *
#include <stdio.h>
int main() {
int soma = 0;
int n = 10;
for (int i = 1; i <= n; i++) {
soma += i; // acumula: soma = 1+2+3+...+n
}
printf("Soma de 1 a %d: %d\n", n, soma); // 55
// Fatorial
long fat = 1;
int k = 10;
for (int i = 2; i <= k; i++) {
fat *= i;
}
printf("%d! = %ld\n", k, fat); // 10! = 3628800
return 0;
}
Soma de 1 a 10: 55
10! = 3628800
#include <stdio.h>
int main() {
int valores[] = {42, 7, 93, 15, 68, 31};
int n = 6;
int maximo = valores[0];
int minimo = valores[0];
for (int i = 1; i < n; i++) {
if (valores[i] > maximo) maximo = valores[i];
if (valores[i] < minimo) minimo = valores[i];
}
printf("Máximo: %d\n", maximo); // 93
printf("Mínimo: %d\n", minimo); // 7
return 0;
}
Máximo: 93
Mínimo: 7
#include <stdio.h>
#include <math.h>
int main() {
// Aproximação de e usando a série: e = 1 + 1/1! + 1/2! + 1/3! + ...
double e_aprox = 0.0;
double fatorial = 1.0;
int termos = 15;
for (int n = 0; n < termos; n++) {
if (n > 0) fatorial *= n; // calcula n! incrementalmente
e_aprox += 1.0 / fatorial;
printf("n=%2d: e ≈ %.10f\n", n, e_aprox);
}
printf("\ne real: 2.7182818284\n");
return 0;
}
n= 0: e ≈ 1.0000000000
n= 1: e ≈ 2.0000000000
n= 2: e ≈ 2.5000000000
n= 3: e ≈ 2.6666666667
n= 4: e ≈ 2.7083333333
n= 5: e ≈ 2.7166666667
...
n=14: e ≈ 2.7182818285
e real: 2.7182818284
O trecho abaixo, extraído diretamente da seção 7 do livro de referência do curso, demonstra os três tipos de loop em sequência. Nesta aula estudamos o for; os demais serão aprofundados na Aula 11:
#include <stdio.h>
int main() {
int i;
// FOR loop: imprime números de 1 a 5
printf("FOR loop:\n");
for (i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
// WHILE loop: imprime números de 6 a 10
printf("WHILE loop:\n");
i = 6;
while (i <= 10) {
printf("%d ", i);
i++;
}
printf("\n");
// DO-WHILE loop: imprime números de 11 a 15
printf("DO-WHILE loop:\n");
i = 11;
do {
printf("%d ", i);
i++;
} while (i <= 15);
printf("\n");
return 0;
}
FOR loop:
1 2 3 4 5
WHILE loop:
6 7 8 9 10
DO-WHILE loop:
11 12 13 14 15
Todos os três campos do for são opcionais. Omiti-los todos cria um loop infinito — útil em sistemas embarcados e servidores, mas que exige sempre uma saída controlada com break:
#include <stdio.h>
int main() {
int contador = 0;
for (;;) { // loop infinito — sem inicialização, condição ou incremento
printf("Iteração %d\n", contador);
contador++;
if (contador >= 5) {
break; // sai do loop quando contador chega a 5
}
}
printf("Loop encerrado.\n");
return 0;
}
Iteração 0
Iteração 1
Iteração 2
Iteração 3
Iteração 4
Loop encerrado.
= em vez de <= na condição, ou esquecer o incremento. Se o programa travar durante o desenvolvimento, suspeite de um loop infinito — encerre com Ctrl+C no terminal ou pelo botão de parada do Code::Blocks.
| Aspecto | C | Java |
|---|---|---|
| Sintaxe básica | for (int i=0; i<n; i++) |
for (int i=0; i<n; i++) (idêntica) |
| Declaração da variável no for | Desde C99: for (int i = 0; ...) |
Sempre disponível: for (int i = 0; ...) |
| Escopo da variável declarada no for | Limitado ao bloco do for (C99) |
Limitado ao bloco do for |
| For-each (enhanced for) | Não existe em C padrão — usa-se índice | for (int x : array) — disponível para arrays e coleções |
| Condição da iteração | Qualquer inteiro — 0 é falso, não-zero é verdadeiro | Deve ser boolean explícito |
| Loop infinito | for (;;) |
for (;;) ou while (true) |
| Verificação de limites do array | Nenhuma — acesso fora dos limites é comportamento indefinido | Automática — lança ArrayIndexOutOfBoundsException |
| Múltiplas variáveis na inicialização | for (i=0, j=10; ...) — suportado |
for (int i=0, j=10; ...) — suportado (mesmo tipo) |
Como C não possui o loop for-each, a iteração sobre arrays é sempre feita com índice explícito:
| C — com índice explícito | Java — for-each |
|---|---|
int nums[] = {10, 20, 30, 40};
int n = 4;
for (int i = 0; i < n; i++) {
printf("%d\n", nums[i]);
}
|
int[] nums = {10, 20, 30, 40};
for (int x : nums) {
System.out.println(x);
}
|
Teste seus conhecimentos sobre o loop for em C: