1. Comparando loops: forvswhile

Um whileloop pode ser usado em qualquer lugar em que uma instrução ou grupo de instruções precise ser executada várias vezes. Mas entre todos os cenários possíveis, um merece destaque.

Estamos falando da situação em que o programador (o criador do programa) sabe antecipadamente quantas vezes o loop deve ser executado. Isso geralmente é tratado declarando uma variável de contador especial e, em seguida, aumentando (ou diminuindo) a variável a 1cada iteração do loop.

Tudo parece funcionar como deveria, mas não é muito conveniente. Antes do loop, definimos o valor inicial da variável contadora. Então na condição verificamos se já atingiu o valor final. Mas geralmente alteramos o valor no final do corpo do loop.

E se o corpo do loop for grande? Ou se tivermos vários loops aninhados? Em geral, nesses casos, é desejável coletar todas essas informações sobre as variáveis ​​do contador em um só lugar. E é por isso que temos o forloop em Java. Também não parece muito complicado:

for (statement 1; condition; statement 2)
{
   block of statements
}

Um whileloop tem apenas uma condição entre parênteses, mas um forloop adiciona duas instruções, separadas por ponto e vírgula.

A realidade é mais simples do que parece: o compilador converte um forloop em um loop comum whilecomo este:

statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Ou melhor ainda, vamos demonstrar isso com um exemplo. Os dois trechos de código abaixo são idênticos.

Opção 1 opção 2
for (int i = 0; i < 20; i++)
{
   System.out.println(i);
}
int i = 0;
while (i < 20)
{
   System.out.println(i);
   i++;
}

Acabamos de reunir em um só lugar todo o código que pertence à ivariável do contador.

Em um forloop, a instrução 1 é executada apenas uma vez, antes do próprio loop começar. Isso pode ser visto claramente no segundo trecho de código

a instrução 2 é executada o mesmo número de vezes que o corpo do loop e, a cada vez, é executada após todo o corpo do loop ter sido executado


2. Onde o forloop é usado

O forloop é provavelmente o tipo de loop mais usado em Java. É usado em todos os lugares, para programadores é apenas mais claro e conveniente do que um whileloop. Praticamente qualquer whileloop pode ser convertido em um forloop.

Exemplos:

loop while para loop
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
for (int i = 3; i >= 0; i--)
{
   System.out.println(i);
}
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
for (int i = 0; i < 3; i++)
{
   System.out.println(i);
}
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
for (boolean isExit = false; !isExit; )
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
while (true)
   System.out.println("C");
for (; true; )
   System.out.println("C");
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}
for (; true; )
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}

Preste atenção ao último exemplo. As instruções para trabalhar com o contador de loop estão ausentes. Não há contador nem declaração.

Em um forloop, o Java permite omitir a "instrução para inicializar o contador" e a "instrução para atualizar o contador". Mesmo a expressão que define a condição do loop pode ser omitida.



3. Nuances do uso do forloop

Um ponto importante sobre o uso forde loops breake continueinstruções.

Uma breakinstrução em um forloop funciona da mesma forma que em um whileloop — ela termina o loop imediatamente. Uma continueinstrução pula o corpo do loop, mas não statement 2(o que altera o contador do loop).

Vamos dar outra olhada em como os loops fore whileestão relacionados.

for (statement 1; condition; statement 2)
{
   block of statements
}
statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Se uma continueinstrução for executada em um forloop , o restante do bloco de instruções será ignorado, mas a instrução 2 (aquela que funciona com a forvariável contadora do loop) ainda será executada.

Vamos voltar ao nosso exemplo pulando números que são divisíveis por 7.

Este código ficará em loop para sempre Este código funcionará bem
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
   i++;
}
for (int i = 1; i <= 20; i++)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
}

O código que usa o whileloop não funcionará — i nunca será maior que 7. Mas o código com o forloop funcionará bem.



4. Comparando loops for: Java vs Pascal

A propósito, Pascal também tem um Forloop. Em geral, praticamente toda linguagem de programação possui uma. Mas em Pascal é super claro. Exemplos:

Pascal Java
For i := 1 to 10 do
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i++)
{
   System.out.println(i);
}
For i := 1 to 10 do step 2
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i = i + 2)
{
   System.out.println(i);
}
For i := 10 downto 0 do step 2
Begin
   Writeln(i);
End;
for (int i = 10; i >= 0; i = i - 2)
{
   System.out.println(i);
}