C#: Estruturas de loop

1. Laço while

O loop while repete um bloco de código enquanto sua condição for true. A condição é verificada antes de cada iteração — se for false, todo o corpo do loop é ignorado.

CSHARP
int count = 1;
while (count <= 5)
{
    Console.WriteLine($"Execution #{count}");
    count++;
}
TEXT 📖 Somente leitura
Execution #1
Execution #2
Execution #3
Execution #4
Execution #5

Dica: Se a condição for false desde o início, o corpo do loop nunca será executado.


2. Laço do...while

O loop do...while executa primeiro o corpo do loop e, em seguida, verifica a condição. O corpo do loop é executado pelo menos uma vez, independentemente da condição.

CSHARP
int number;
do
{
    Console.WriteLine("Enter a positive number:");
    number = int.Parse(Console.ReadLine());
} while (number <= 0);
Console.WriteLine($"You entered: {number}");

Atenção: O ponto-e-vírgula no final de do...while é obrigatório — essa é uma diferença de sintaxe em relação ao loop while.


3. Laço “for”

O loop for combina a inicialização, a condição e a atualização da iteração em uma única linha, tornando-o ideal quando o número de iterações é conhecido de antemão.

CSHARP
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"i = {i}");
}
TEXT 📖 Somente leitura
i = 1
i = 2
i = 3
i = 4
i = 5

Todas as três partes da instrução for podem ser omitidas, mas os pontos-e-vírgulas devem permanecer:

CSHARP
int j = 0;
for (; j < 3; )
{
    Console.WriteLine($"j = {j}");
    j++;
}
TEXT 📖 Somente leitura
j = 0
j = 1
j = 2

4. Laço foreach

O loop foreach é um recurso do C# que permite iterar sobre cada elemento de uma coleção. Ele oferece uma sintaxe clara e segura e funciona com matrizes, listas e qualquer coleção que implemente IEnumerable.

CSHARP
string[] fruits = { "Apple", "Banana", "Orange" };
foreach (var fruit in fruits)
{
    Console.WriteLine($"Fruit: {fruit}");
}
TEXT 📖 Somente leitura
Fruit: Apple
Fruit: Banana
Fruit: Orange

Aviso: O loop foreach é somente leitura — a variável de iteração é uma cópia somente leitura. Não é possível modificar elementos da coleção por meio dela, nem adicionar ou remover elementos durante a iteração; caso contrário, será lançada uma exceção InvalidOperationException.

▶ Exemplo

CSHARP
int[] scores = { 90, 85, 72, 60, 95 };
int sum = 0;
foreach (int score in scores)
{
    sum += score;
}
Console.WriteLine($"Total: {sum}, Average: {(double)sum / scores.Length:F1}");
▶ Experimente
TEXT 📖 Somente leitura
Total: 402, Average: 80.4

5. Laços aninhados

Um loop dentro de outro loop é chamado de loop aninhado, comumente utilizado para processar estruturas de dados bidimensionais, como matrizes e tabelas.

CSHARP
for (int row = 1; row <= 3; row++)
{
    for (int col = 1; col <= 4; col++)
    {
        Console.Write($"{row * col,4}");
    }
    Console.WriteLine();
}
TEXT 📖 Somente leitura
   1   2   3   4
   2   4   6   8
   3   6   9  12

Atenção: Os loops aninhados têm complexidade temporal O(n²); quanto mais camadas, pior é o desempenho. Na prática, evite aninhamentos profundos e considere usar o LINQ ou extrair métodos para otimizar.


6. break e continue

(1) intervalo

break sai imediatamente do loop atual, pulando todas as iterações restantes.

CSHARP
for (int i = 0; i < 10; i++)
{
    if (i == 5) break;
    Console.Write($"{i} ");
}
TEXT 📖 Somente leitura
0 1 2 3 4

(2) continuar

continue ignora o restante da iteração atual e salta para a próxima.

CSHARP
for (int i = 0; i < 6; i++)
{
    if (i % 2 == 0) continue;
    Console.Write($"{i} ");
}
TEXT 📖 Somente leitura
1 3 5

Dica: break e continue afetam apenas o loop mais interno. Para sair de várias camadas, use uma variável de sinalizador ou instruções rotuladas.


7. Padrões comuns de loop

(1) Padrão de contagem

Contar os elementos que satisfazem uma condição:

CSHARP
int[] data = { 12, 25, 8, 33, 17, 6, 41 };
int count = 0;
foreach (int val in data)
{
    if (val > 20) count++;
}
Console.WriteLine($"Count of values > 20: {count}");
TEXT 📖 Somente leitura
Count of values > 20: 3

(2) Padrão de acumulação

Somar uma série de números:

CSHARP
int sum = 0;
for (int i = 1; i <= 100; i++)
{
    sum += i;
}
Console.WriteLine($"Sum of 1 to 100: {sum}");
TEXT 📖 Somente leitura
Sum of 1 to 100: 5050

(3) Padrão de pesquisa

Encontrar um elemento específico em uma coleção:

CSHARP
int[] numbers = { 3, 7, 15, 22, 9, 31 };
int target = 22;
int index = -1;
for (int i = 0; i < numbers.Length; i++)
{
    if (numbers[i] == target)
    {
        index = i;
        break;
    }
}
Console.WriteLine(index >= 0 ? $"Found {target} at index {index}" : "Not found");
TEXT 📖 Somente leitura
Found 22 at index 3

▶ Exemplo

Combinando vários padrões — analisar a distribuição de notas e calcular a média:

CSHARP
int[] scores = { 92, 78, 55, 88, 43, 96, 67, 73, 81, 50 };
int excellent = 0, pass = 0, fail = 0, total = 0;
foreach (int s in scores)
{
    total += s;
    if (s >= 90) excellent++;
    else if (s >= 60) pass++;
    else fail++;
}
double avg = (double)total / scores.Length;
Console.WriteLine($"Excellent: {excellent}, Pass: {pass}, Fail: {fail}");
Console.WriteLine($"Average: {avg:F1}");
▶ Experimente
TEXT 📖 Somente leitura
Excellent: 2, Pass: 5, Fail: 3
Average: 72.3

8. Ciclos infinitos e como evitá-los

Um loop infinito ocorre quando a condição do loop é sempre true, fazendo com que o loop nunca termine. Padrões comuns de loop infinito:

CSHARP
while (true)
{
}

for (; ; )
{
}

▶ Exemplo

Um ciclo controlado com condições de saída para evitar ciclos infinitos:

CSHARP
Random rnd = new Random();
int attempts = 0;
while (true)
{
    int value = rnd.Next(1, 101);
    attempts++;
    if (value == 42)
    {
        Console.WriteLine($"Got 42 on attempt #{attempts}!");
        break;
    }
    if (attempts > 1000)
    {
        Console.WriteLine("Too many attempts, exiting loop.");
        break;
    }
}
▶ Experimente

Orientações para evitar loops infinitos:

Na prática, while (true) com break é um padrão de loop comum, mas certifique-se de que cada ramificação tenha uma oportunidade de saída.

❓ Perguntas Frequentes

P: Qual é a diferença entre while e do...while? R: while verifica primeiro a condição e pode nunca executar o corpo; do...while executa primeiro o corpo, portanto, ele é executado pelo menos uma vez.

P: Posso modificar elementos de uma coleção em um loop foreach? R: Não. A variável de iteração é uma cópia somente leitura — modificá-la não afeta a coleção original. Use um loop for com acesso por índice se precisar modificar elementos.

P: O break pode sair de vários loops aninhados? R: Não. O break sai apenas do loop mais interno. Para sair de várias camadas, use uma variável de sinalizador ou extraia o loop interno para um método e use o return.

P: Existe alguma diferença entre for (; ; ) e while (true)? R: Eles são funcionalmente idênticos — ambos criam loops infinitos. while (true) é mais legível, enquanto for (; ; ) pode evitar avisos do compilador em alguns ambientes.

📖 Resumo

📝 Exercícios

  1. Escreva um programa que utilize um loop while para calcular as potências de 2 até que o valor ultrapasse 1000 e exiba todos os resultados.
  2. Use um loop for para imprimir uma tabuada na forma triangular superior (evite repetições).
  3. Dado um array de strings, use foreach para contar quantas strings têm comprimento maior que 5.
  4. Escreva um programa usando do...while que solicite repetidamente ao usuário uma senha até que a senha correta seja digitada (defina você mesmo qual é a senha correta).
  5. Use loops for aninhados para encontrar todos os números primos entre 1 e 50.
  6. Use continue em um loop for para imprimir todos os números de 1 a 20 que não sejam divisíveis por 3.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%