O que esta acontecendo é o seguinte:
array com os valores 1, 2, 3 e 4, mas as posições deles no array são 0, 1, 2 e 3
começa o for
i vai receber 1 porque no for each cada vez que há um loop a variavel recebe o proximo elemento do array/coleção, então o i vai receber o valor da primeira posição, depois o valor da segunda posição, etc…
começa o for
i = 1
//array da posição 1(segundo elemento) vai receber 0
array[1] = 0
//1ª iteração array = 1, 0, 3, 4
i = 0 // por que ele recebera o segundo elemento e você colocou o valor dele como 0 na primeira iteração
//array posição 0 (primeiro elemento) vai receber 0
array[0] = 0
//2ª iteraçao array = 0, 0, 3, 4
i = 3 // 3 é o valor do terceiro elemento
//array da posição 3(quarto elemento) vai receber 0
array[3] = 0
3ª iteração array = 0, 0, 3, 0
i = 0 porque ele recebera o valor do 4º elemento que na iteração anterior foi definido como 0
//array da posição 0(primeiro elemento) vai receber 0
array[0] = 0
//4ª iteração array = 0, 0, 3, 0
depois ele imprime.
Espero ter ajudado.
FUI