Laço for em C# a fundo: contagem regressiva, passos e for aninhado
- Gerar link
- X
- Outros aplicativos

Resumo rápido
- O
fortem três partes: início, condição e passo, separadas por;. - O passo não precisa ser
i++: pode seri--,i += 2ou o que você quiser. - Contagem regressiva: comece alto, use
i >= 0ei--. - Para percorrer um array do fim para o começo, comece em
Length - 1. - Um for dentro de outro passa por todas as combinações.
- O erro mais comum é o "um a mais":
<=onde deveria ser<.
No post Laços de repetição em C# você viu while, do while, for e foreach lado a lado. Aqui o foco é só o for, o laço que você mais vai usar quando sabe quantas vezes repetir, e os truques que ele permite.
As três partes do for

C#
for (int bala = 1; bala <= 3; bala++)
{
Console.WriteLine($"Disparo {bala}");
}
Console.WriteLine("Pente vazio.");
Saída esperada
Disparo 1
Disparo 2
Disparo 3
Pente vazio.
| Parte | No exemplo | Quando roda |
|---|---|---|
| início | int bala = 1 | uma vez, antes de tudo |
| condição | bala <= 3 | antes de cada volta; se for false, o laço acaba |
| passo | bala++ | depois de cada volta |
A ordem real é: início → condição → corpo → passo → condição → corpo → passo... até a condição dar false. Na quarta checagem, bala vale 4, a condição falha e o programa segue para "Pente vazio".
Contagem regressiva

Para contar para trás, inverta tudo: comece no maior número, mantenha o laço enquanto for maior ou igual ao menor, e use --:
C#
for (int segundos = 5; segundos >= 1; segundos--)
{
Console.WriteLine($"Bomba em {segundos}...");
}
Console.WriteLine("BOOM! Ainda bem que você correu.");
Saída esperada
Bomba em 5...
Bomba em 4...
Bomba em 3...
Bomba em 2...
Bomba em 1...
BOOM! Ainda bem que você correu.
Passos diferentes de 1
O passo pode ser qualquer conta. Com += 2 você pula de dois em dois; com *= 2, dobra a cada volta:
C#
Console.Write("Patrulha nas salas pares: ");
for (int sala = 0; sala <= 8; sala += 2)
{
Console.Write($"{sala} ");
}
Console.WriteLine();
Console.Write("Zumbis a cada noite: ");
for (int zumbis = 1; zumbis <= 32; zumbis *= 2)
{
Console.Write($"{zumbis} ");
}
Console.WriteLine();
Saída esperada
Patrulha nas salas pares: 0 2 4 6 8
Zumbis a cada noite: 1 2 4 8 16 32
Percorrendo um array de trás para frente
O último índice de um array é Length - 1. Começando dali e descendo até 0, você lê a mochila do fim para o começo, como uma pilha:
C#
string[] mochila = { "lanterna", "erva", "pistola", "mapa" };
for (int i = mochila.Length - 1; i >= 0; i--)
{
Console.WriteLine($"[{i}] {mochila[i]}");
}
Saída esperada
[3] mapa
[2] pistola
[1] erva
[0] lanterna
Esse é um dos motivos para escolher for em vez de foreach: o foreach só anda para frente, e o for te dá o índice e a direção.
for aninhado: todas as combinações
Um for dentro de outro roda o de dentro inteiro para cada volta do de fora. Serve para grades, tabelas e combinações:
C#
string[] armas = { "Faca", "Pistola" };
string[] alvos = { "Zumbi", "Cão" };
for (int a = 0; a < armas.Length; a++)
{
for (int b = 0; b < alvos.Length; b++)
{
Console.WriteLine($"{armas[a]} contra {alvos[b]}");
}
}
Saída esperada
Faca contra Zumbi
Faca contra Cão
Pistola contra Zumbi
Pistola contra Cão
São 2 armas × 2 alvos = 4 linhas. Cuidado com o tamanho: 1.000 × 1.000 já dá um milhão de voltas. Para desenhar mapas em grade, veja o post de matrizes em C#.
break e continue dentro do for
C#
int[] portas = { 0, 0, 2, 0, 1, 0 }; // 0 = vazia, 2 = zumbi, 1 = saída
for (int i = 0; i < portas.Length; i++)
{
if (portas[i] == 2)
{
Console.WriteLine($"Porta {i}: zumbi! Pulando esta.");
continue; // vai direto para a próxima volta
}
if (portas[i] == 1)
{
Console.WriteLine($"Porta {i}: SAÍDA encontrada!");
break; // encerra o laço
}
Console.WriteLine($"Porta {i}: vazia.");
}
Saída esperada
Porta 0: vazia.
Porta 1: vazia.
Porta 2: zumbi! Pulando esta.
Porta 3: vazia.
Porta 4: SAÍDA encontrada!
A porta 5 nem é visitada: o break acabou com o laço ao achar a saída.
Erros comuns

1. O erro do "um a mais" (off-by-one). É o bug mais famoso do for. Com <=, o laço tenta acessar um índice que não existe:
C#
string[] mochila = { "lanterna", "erva", "pistola" };
for (int i = 0; i <= mochila.Length; i++) // i chega a 3
Console.WriteLine(mochila[i]); // IndexOutOfRangeException
Para arrays, a regra é sempre i = 0 e i < Length.
2. Laço infinito. for (int i = 10; i > 0; i++) nunca termina: o i sobe, e a condição continua verdadeira. O passo precisa andar na direção que faz a condição ficar falsa.
3. Ponto e vírgula depois do for. for (int i = 0; i < 3; i++); com ; no fim roda um laço vazio, e o bloco abaixo executa uma vez só.
4. Mudar o contador dentro do corpo. Mexer em i dentro do laço deixa o comportamento difícil de prever. Se precisa disso, um while costuma ser mais claro.
DESAFIO
Tente resolver antes de abrir a resposta. Sobreviveu? Vá para o próximo.
Escreva um for que mostre 10, 20, 30, 40 e 50.
Ver resposta
for (int i = 10; i <= 50; i += 10) Console.WriteLine(i);Quantas vezes roda o corpo de
for (int i = 0; i < 12; i += 3)?Ver resposta
4 vezes: com
ivalendo 0, 3, 6 e 9. No 12 a condição falha.Num for aninhado com 3 voltas no de fora e 5 no de dentro, quantas vezes roda o corpo de dentro?
Ver resposta
15 vezes (3 × 5).
Corrija:
for (int i = 1; i <= mochila.Length; i++) Console.WriteLine(mochila[i]);Ver resposta
for (int i = 0; i < mochila.Length; i++). Começa em 0 e para antes doLength, senão pula o primeiro item e estoura no último.
Conclusão
Com as três partes do for sob controle, você conta para frente, para trás, de dois em dois, percorre arrays do fim para o começo e combina listas com laços aninhados. E sabendo do "um a mais", já escapa do bug que derruba muito iniciante.
📖 Volte ao panorama: Laços de repetição em C#: while, do while, for e foreach.
Comentários
Postar um comentário