Dlaczego podwójny wynik for?

0

Witam, nie mogę zrozumieć dlaczego pętla for pokazuje podwójnie
0
0
1
1
2
2
3
3
4
4
Przecież jest tam zawsze i++, to dlaczego powraca do tej samej liczby? Instrukcję break rozumiem.

// Umiejscowienie etykiety ma znaczenie .
class Break6 {
    public static void main(String args[]) {
        int x=0, y=0;

// tutaj etykieta poprzedza instrukcje for
        stop1: for(x=0; x < 5; x++) {
            for(y = 0; y < 5; y++) {
                if(y == 2) break stop1;
                System.out.println("x i  y: " + x + " " + y);
            }
        }

        System.out.println();

//  a tutaj nawias { otwierajacy blok instrukcji for
        for(x=0; x < 5; x++)
            stop2: {
                for(y = 0; y < 5; y++) {
                    if(y == 2) break stop2;
                    System.out.println("x i y: " + x + " " + y);
                }
            }

    }
}

0

Dlaczego nie pokazujesz w pełni co wypluwa System.out.println? Przecież wtedy byś zobaczył o co chodzi...

0

Wiem dlaczego break zatrzymuje na 2, ale nie wiem czemu podwójnie pokazuje 0011223344, a po prawej stronie już 1
00 ok
01 czemu tu zero a tam już 1?
x++ i y++ nie powinny być takie same wyniki?

0

W drugiej pętli wykonujesz 5 razy (od x=0 do x=4) kod w klamerce stop2: {. Więc pięć razy wypisujesz po dwie takie same wartości x, bo zagnieżdżona pętla z iteratorem y ma dwa obroty wypisujące wartości, przy trzecim następuje break. Na dobrą sprawę ten break może być bez etykiety i będzie działać tak samo.

Jak dla mnie, pierwszy przykład (stop1) jest mniej zrozumiały bo niby cofamy się przed wszystkie pętle (cała aplikacja powinna się zapętlić w tym miejscu).
Ale widocznie przy takiej etykiecie już ponownie aplikacja nie wchodzi w pętle. W drugim przypadku wychodzisz tylko z jednego fora (zagnieżdżonego), więc pierwszy działa bez zarzutu.

0
public class ForDwa {
    public static void main(String[] args) {
        int x = 0, y = 0;
        // tutaj etykieta poprzedza instrukcje for
        for(x=0; x < 5; x++) {
            for(y = 0; y < 5; y++) {

                System.out.println("x i  y: " + x + " " + y);
            }
        }
    }
}
//wynik
x i  y: 0 0
x i  y: 0 1
x i  y: 0 2
x i  y: 0 3
x i  y: 0 4
x i  y: 1 0
x i  y: 1 1
x i  y: 1 2
x i  y: 1 3
x i  y: 1 4
x i  y: 2 0
x i  y: 2 1
x i  y: 2 2
x i  y: 2 3
x i  y: 2 4
x i  y: 3 0
x i  y: 3 1
x i  y: 3 2
x i  y: 3 3
x i  y: 3 4
x i  y: 4 0
x i  y: 4 1
x i  y: 4 2
x i  y: 4 3
x i  y: 4 4

Zmniejszyłem program, aby wyjaśnić o co mi chodziło.
Dobra już chyba łapę, ty mi nadal tłumaczysz o break, a ja to rozumiem. Nie rozumiałem tylko dlaczego po prawo u "y" jest inny wynik. Teraz wiem, że wpierw pokazuje x i przypisuje mu zero, następnie pokazuje y pięć razy, za każdym razem pokazując przy x to zdublowane zero, dopóki y nie dojdzie do 5. Czyli pętla z x cztery razy nie działa tylko kopiuje wynik z zerem, aż y osiągnie pięć, wtedy kolejna 1 jest wyświetlana i kopiowana cztery razy...

0

No i prawidłowo. Dla każdego x (od 0 do 4) wykonujesz pętlę:

            for(y = 0; y < 5; y++) {
 
                System.out.println("x i  y: " + x + " " + y);
            }

Ta pętla wypisuje wszystkie swoje wartości dla obecnego x. Potem dopiero zwiększa się wartość x i znowu jest wykonywana pętla y.

0

Dzięki za pomoc już rozumiem. A jak bym chciał, aby w dwóch pętlach były obok siebie jednakowe wyniki, nie da się tak?
0 0
1 1
2 2
3 3
4 4

0

Da się. Po prostu piszesz jedną pętlę:

System.out.println("x i x: " + x + " " + x);

Wywalasz pętlę y razem z jej klamerką.

1 użytkowników online, w tym zalogowanych: 0, gości: 1