O que o seguinte segmento de programa faz?
1 for ( i = 1; i
2 for ( j = 1; j
3 for ( k = 1; k
4 printf( “*” );
5 printf( “\n” );
6 }
7 printf( “\n” );
8 }
Passo 1
Fala, programador(a)! Provavelmente você veio aqui porque olhou aquele laço triplo e pensou:

Mas calma, gafanhoto! Para entender melhor de laços aninhados, vou te explicar como seria se eu tivesse um laço duplo primeiro, tá bom? A lógica para um laço triplo fica moleza quando você entende o duplo! Vamos supor o seguinte código:

Vai imprimir o seguinte código:

Basicamente, a gente vai começar no laço externo com o valor i = 1, e só vamos passar para a próxima execução do laço (ou seja, para i = 2), quando eu tiver executado todo o laço interno, ou seja, quando já tiver feito as 4 repetições do código dentro do lado mais interno, imprimindo 1ª repetição do laço mais interno, depois 2ª, 3ª e 4ª. Só assim, eu passo para a 2ª repetição do laço mais externo, repito novamente o laço mais interno inteiro, para só aí ir para o i = 3 e assim até terminar o código.
Então, o que rola é o seguinte: quando eu tenho laços aninhados, é que eu vou executar o laço mais interno todo n vezes, até já ter se esgotado todas as repetições do laço mais externo. Isso vai ser muuuito útil, principalmente quando formos trabalhar com matrizes.
Da mesma forma, ocorrerá com os 3 laços. Vou chamar o mais externo de todos de laço 1, o que vem logo em seguida de laço 2 e o mais interno de todos de laço 3, ok? Bom, na primeira repetição do laço 1, a gente vai a primeira repetição do laço 2 e, nela, vamos executar todas as repetições do laço 3. Daí, passaremos para a segunda do laço 2, em que executaremos o laço 3 inteiro novamente. Quando terminarmos todo o laço 2, finalmente iremos para a segunda repetição do laço 1, repetindo todo esse processo até ele acabar. Caso tenha ficado confuso, leia novamente o código de exemplo e a sua execução, vai fazer todo o sentido, prometo!

Passo 2
Nesse problema, temos o seguinte código (o problema corta linhas triviais no enunciado, mas vou deixar completinho pra você):

OK, o loop 1 vai ter 5 repetições (pois eu vou de i valendo 1 até i valendo 5). Na primeira repetição, eu vou entrar no loop 2, que será repetido 3 vezes. Na sua primeira repetição, eu vou entrar no loop 3 e como ele é o mais interno, vou executá-lo totalmente. A cada repetição do loop 3, eu printo um asterisco e pulo uma linha. Como ele repete 4 vezes, eu vou imprimir 4 asteriscos, um abaixo do outro.
Daí eu continuo na primeira repetição do loop 2 e pulo uma linha antes de partir para a segunda a repetição. Como se isso vai se repetir 3 vezes, eu vou fazer 3 vezes essa instrução: bloco de 4 asteriscos um abaixo do outro + linha em branco. Mas o loop 1 faz com que o loop 2 seja repetido 5 vezes. Então, ao todo, eu vou imprimir (5 repetições * 3 repetições) 15 vezes a instrução “4 asteriscos um abaixo do outro + linha em branco”. Mais ou menos assim:

Se você rolasse a barrinha, veria que são 15 blocos desses, totalizando 60 asteriscos, OMG!!
Resposta
Esse código equivale a um loop único, com 15 repetições, que imprime, a cada repetição, 4 asteriscos um embaixo do outro e depois pula uma linha.