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.
int count = 1;
while (count <= 5)
{
Console.WriteLine($"Execution #{count}");
count++;
}
Execution #1
Execution #2
Execution #3
Execution #4
Execution #5
Dica: Se a condição for
falsedesde 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.
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 loopwhile.
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.
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"i = {i}");
}
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:
int j = 0;
for (; j < 3; )
{
Console.WriteLine($"j = {j}");
j++;
}
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.
string[] fruits = { "Apple", "Banana", "Orange" };
foreach (var fruit in fruits)
{
Console.WriteLine($"Fruit: {fruit}");
}
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çãoInvalidOperationException.
▶ Exemplo
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}");
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.
for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 4; col++)
{
Console.Write($"{row * col,4}");
}
Console.WriteLine();
}
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.
for (int i = 0; i < 10; i++)
{
if (i == 5) break;
Console.Write($"{i} ");
}
0 1 2 3 4
(2) continuar
continue ignora o restante da iteração atual e salta para a próxima.
for (int i = 0; i < 6; i++)
{
if (i % 2 == 0) continue;
Console.Write($"{i} ");
}
1 3 5
Dica:
breakecontinueafetam 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:
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}");
Count of values > 20: 3
(2) Padrão de acumulação
Somar uma série de números:
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine($"Sum of 1 to 100: {sum}");
Sum of 1 to 100: 5050
(3) Padrão de pesquisa
Encontrar um elemento específico em uma coleção:
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");
Found 22 at index 3
▶ Exemplo
Combinando vários padrões — analisar a distribuição de notas e calcular a média:
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}");
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:
while (true)
{
}
for (; ; )
{
}
▶ Exemplo
Um ciclo controlado com condições de saída para evitar ciclos infinitos:
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;
}
}
Orientações para evitar loops infinitos:
- Certifique-se de que as condições
whileeforvenham a se tornarfalse - Ao utilizar
while (true)oufor (; ; ), sempre forneça um caminho de saídabreak - Definir um número máximo de iterações como medida de segurança
- Verifique novamente a lógica de atualização da variável de loop para evitar que incrementos ou decrementos sejam acidentalmente pulados
Na prática,
while (true)combreaké 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
whileedo...while? R:whileverifica primeiro a condição e pode nunca executar o corpo;do...whileexecuta 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 loopforcom acesso por índice se precisar modificar elementos.
P: O
breakpode sair de vários loops aninhados? R: Não. Obreaksai 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 oreturn.
P: Existe alguma diferença entre
for (; ; )ewhile (true)? R: Eles são funcionalmente idênticos — ambos criam loops infinitos.while (true)é mais legível, enquantofor (; ; )pode evitar avisos do compilador em alguns ambientes.
📖 Resumo
whileverifica a condição primeiro; o corpo do código é executado somente quando a condição étruedo...whileexecuta o corpo da instrução uma vez antes de verificar a condiçãoforé ideal para casos em que o número de iterações é conhecido, com uma sintaxe compactaforeaché um recurso do C# que permite iterar por coleções de maneira organizada, mas a variável de iteração é somente de leitura- Os loops aninhados lidam com dados multidimensionais — preste atenção ao impacto no desempenho de O(n²)
breaksai imediatamente do loop;continuepula a iteração atual- Padrões comuns: contagem, acumulação, busca, percurso
- Os loops infinitos podem ser controlados com
while (true)+break, mas é preciso sempre definir uma condição de saída
📝 Exercícios
- Escreva um programa que utilize um loop
whilepara calcular as potências de 2 até que o valor ultrapasse 1000 e exiba todos os resultados. - Use um loop
forpara imprimir uma tabuada na forma triangular superior (evite repetições). - Dado um array de strings, use
foreachpara contar quantas strings têm comprimento maior que 5. - Escreva um programa usando
do...whileque solicite repetidamente ao usuário uma senha até que a senha correta seja digitada (defina você mesmo qual é a senha correta). - Use loops
foraninhados para encontrar todos os números primos entre 1 e 50. - Use
continueem um loopforpara imprimir todos os números de 1 a 20 que não sejam divisíveis por 3.