Chodzi mi o to że gdy po sprawdzeniu warunku, będzie on sprzeczny i wykona się nie to co jest w ciele if-
tylko to co jest w ciele else
i aby w tym else
było coś takiego co każe programowi ponownie wykonać tego całego if-a
.
Odpowiem, abstrahując od Javy. Zmienne w1
, w2
itd. będą u mnie zmiennymi (binarnymi), która "odpowiadają za kolejne warunki". Zmienna z
będzie czasem zmienną pomocniczą przy bardziej złożonych warunkach.
Przepraszam, jeśli to wszystko, co przeczytasz, już wiesz. :)
Mniej-więcej można powiedzieć, że opisane przez ciebie zachowanie to główne zastosowanie instrukcji continue
– w różnych językach. Przykład (pseudokod):
while (w1 == true) { // lub też po prostu while(w1) – ale nie w każdym języku to działa identycznie! Np. w Javascripcie działa chyba inaczej niż w Javie
if (w2 == true) {
zrobCos();
} else {
continue; // przeskocz na początek pętli
}
}
Jednak ogólnie pętla while
działa na takiej zasadzie, że powyższy kod może być równie dobrze zapisany w ten sposób:
while (w1 == true) {
if (w2 == true) {
zrobCos();
} // a jeżeli warunek nie jest spełniony, przeskocz na początek pętli
}
Obie powyższe pętle zrobią to samo.
Jeżeli masz tylko jeden warunek – i nie wiesz, czy dać go w argumencie pętli (w nawiasach), czy też w ifie – to najprawdopodobniej nie potrzeba do tego ifa (jak wspomniał @Panczo). Przykład (pseudokod):
while (w1 == true) {
zrobCos();
}
Powyższa pętla wykona się tak długo, jak długo warunek będzie spełniany. Instrukcja continue
jest wykonywana jakby niejawnie (piszę "jakby", bo nie chcę wchodzić w szczegóły jakiegoś języka).
Jeżeli Twój warunek byłby na początku false
– a chciałbyś, żeby stał się true
po którymś obiegu pętli – możesz go zanegować w argumencie pętli. Przykład (pseudokod):
z = zrobCosPoczatkowego();
w1 = (z == cosTam); // przypisuję zmiennej w1 wartość true lub false, w zależności od funkcji zrobCosPoczatkowego()
while (!w1) { // dopóki !false, czyli true. Można też while(w1 == false)
z = zrobCos();
w1 = (z == cosTam);
}
Ta pętla mogłaby zostać wykorzystana na przykład do generowania liczb pseudolosowych z zadanego przedziału; w uproszczeniu: while (!(granicaDolna < liczba < granicaGorna)) { liczba = losuj(); }
.
W powyższym kodzie mamy dwa wystąpienia tej samej (!) linijki. To nie całkiem dobrze. Należy unikać takich powtórzeń, o czym mówi szeroko stosowana zasada DRY (Don't Repeat Yourself). Wydaje mi się, że to mógł być jeden z głównych powodów wprowadzenia instrukcji do-while
(w niektórych językach). Tak więc powyższe możemy zapisać prościej (a nawet jeśli tak samo prosto, to na pewno krócej):
z = zrobCosPoczatkowego();
do {
z = zrobCos();
w1 = (z == cosTam); // przypisuję zmiennej w1 wartość true lub false, w zależności od funkcji zrobCosPoczatkowego()
} while (!w1);
Lub jeszcze krócej:
do {
z = zrobCos();
} while (!(z == cosTam));
UPDATE: Nie wspomniałem o instrukcji goto
, ale może już nie będą gmatwał.