Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Um caso curioso de escopo, memória e variáveis

Achei o caso abaixo curioso. Percebi quando estava aprendendo a fazer while.


public class WhileLoop {

    public static void main(String[] args) {
        int x = 3;
        while (x > 0) {
            System.out.println("Primeiro teste " + x);
            x--;
        }

        while (x >= 0) {
            System.out.println("Segundo teste " + x);
            x--;
        }

    }

}

O resultado disto é : Primeiro teste 3 Primeiro teste 2 Primeiro teste 1 Segundo teste 0

Mesmo o X estando fora do while, depois de executar o primeiro loop o segundo loop aproveita a memória usada dentro do primeiro. Não busca novamente a informação de fora do X que seria 3.

Entretanto, se criar uma variável Y = X passamos a ter dois loops independentes.


public class WhileLoop {

    public static void main(String[] args) {
        int x = 3;
        int y = x;
        while (x > 0) {
            System.out.println("Primeiro teste " + x);
            x--;
        }

        while (y >= 0) {
            System.out.println("Segundo teste " + y);
            y--;
        }

    }

}

Resultado:

Primeiro teste 3 Primeiro teste 2 Primeiro teste 1 Segundo teste 3 Segundo teste 2 Segundo teste 1 Segundo teste 0

2 respostas

Oi Bruno tudo bem?

O programa não busca novamente a informação de fora do X que seria 3 porque ele já passou pela aquela linha e não irá passar por ela novamente.

Bons estudos!!!

solução!

Oi Bruno! Tudo bem?

A variável X, quando definida fora do laço WHILE, e o laço está modificando seu valor, ela não retornará a 3. Ao final seu valor será 1.

O segundo laço então, tambem utiliza a mesma variável X, que agora é 1. No seu critério para executar o laço é x > 0 que é VERDADE, logo ele ainda executa uma vez até o valor do X ser 0 e não mais executar o segundo laço.

Quando queremos que o valor da variável não mude, poderíamos:

1) criar uma segunda variável, como você mesmo informou: int y=x; e passar essa ao segundo laço, ou

2) Colocar cada laço dentro de um método distinto, que recebe o número. Assim, cada método trabalharia com uma cópia do valor de x.

public class WhileLoop2 {

    public static void main(String[] args) {
        int x = 3;
       laco1(x);
       laco2(x);
    }

    public static void laco1(int x){
        while (x > 0) {
            System.out.println("Primeiro teste " + x);
            x--;
        }        
    }

    public static void laco2(int x){
        while (x > 0) {
            System.out.println("Segundo teste " + x);
            x--;
        }        
    }

}

Espero ter ajudado,

Abraço e sucesso,

Rodrigo