Entendendo o Controle Avançado de Fluxo
Até agora, temos lidado com loops únicos que só terminam quando a expressão booleana é avaliada como falsa. Agora mostraremos a você outras maneiras pelas quais os loops podem terminar, ou ramificar e você verá que o caminho tomado durante o tempo de execução pode não ser tão simples como em exemplos.
Loops aninhados
Primeiro, os loops podem conter outros loops. Por exemplo, considere o seguinte código que interage sobre uma matriz bidimensional, uma matriz que contém outras matrizes como seus membros. Veremos as matrizes multidimensionais em detalhes no Capítulo 3, mas por enquanto suponha que a seguinte seja como você declararia uma matriz bidimensional.
int[][] myComplexArray = {{5,2,1,3},{3,9,8,9},{5,7,12,7}};
for(int[] mySimpleArray : myComplexArray) {
for(int i=0; i<mySimpleArray.length; i++) {
System.out.print(mySimpleArray[i]+"\t");
}
System.out.println();
}
Note que nós intencionalmente misturamos uma for e for-each neste exemplo. O loop exterior executará um total de três vezes. Cada vez que o loop externo é executado, o loop interno é executado quatro vezes. Quando executamos esse código, vemos a seguinte saída:
5 2 1 3
3 9 8 9
5 7 12 7
Loops aninhados podem incluir while e do-while , conforme mostrado neste exemplo. Veja se você consegue determinar o que este código produzirá.
int x = 20;
while(x>0) {
do {
x -= 2
} while (x>5);
x--;
System.out.print(x+"\t");
}
Na primeira vez que esse loop é executado, o loop interno é repetido até que o valor de x seja 4. O valor será então decrementado para 3 e será a saída no final da primeira iteração do laço externo. Na segunda iteração do circuito externo, o interior do-while vai ser executado uma vez, mesmo que x já não seja maior que 5. Como você pode lembrar, do-while sempre executam o corpo pelo menos uma vez. Isso reduzirá o valor para 1 , que será ainda mais reduzido pelo operador de decréscimo no loop externo para 0 . Quando o valor chegar a 0, o loop externo será finalizado. O resultado é que o código mostrará o seguinte:
3 0