Instrukcja warunkowa to konstrukcja która umożliwia określenie warunku dla wykonania pewnego fragmentu kodu – kodu który chcemy uruchomić tylko wtedy, gdy spełnione są pewne warunki. Ogólna postać instrukcji warunkowej jest następująca:
if( {warunek} ) { {kod wykonywany warunkowo} }
Element {warunek} to dowolne wyrażenie które wylicza się do wartości typu boolean – w typowym przypadku jest to jakieś porównanie, np. x > y. Element {kod wykonywany warunkowo} to dowolny ciąg instrukcji, który wykona się tylko i wyłącznie wtedy, gdy {warunek} ma wartość true, tj. gdy warunek instrukcji warunkowej jest spełniony.
Instrukcja warunkowa umożliwia także określenie kodu wykonywanego alternatywnie, tj. kodu który ma się wykonać gdy warunek nie jest prawdziwy. Jest to tak zwana instrukcja IF-ELSE i ma ona postać:
if( {warunek} ) { {kod wykonywany warunkowo} } else { {kod wykonywany alternatywnie} }
Element {kod wykonywany alternatywnie} to dowolny ciąg instrukcji które będą wykonane jeśli warunek instrukcji warunkowej jest fałszywy. Przykładowo, poniższa metoda wyświetla dla zadanej liczby informację czy jest to liczba dodatnia czy nie.
void isPositive(int x) { if( x > 0 ) { System.out.println("liczba " + x + " jest dodatnia"); } else { System.out.println("liczba " + x + " jest niedodatnia"); } }
Możemy instrukcję IF-ELSE rozbudować jeszcze bardziej, określając szereg warunków i bloków instrukcji. Instrukcja taka ma postać:
if( {warunek} ) { {kod wykonywany warunkowo} } else if ( {warunek drugi} ) { {kod wykonywany gdy spełniony jest drugi warunek} } else { {kod wykonywany alternatywnie} }
Blok ELSE jest opcjonalny ale jeśli występuje to może być co najwyżej jeden. Bloków ELSE-IF może być dowolnie wiele – tak wiele jak wiele potrzebujemy. Poniżej udoskonalona wersja funkcji isPositive(…) która rozdziela wartości niedodatnie na wartości ujemne i zero:
void isPositive(int x) { if( x > 0 ) { System.out.println("liczba " + x + " jest dodatnia"); } else if( x == 0 ) { System.out.println("liczba " + x + " jest równa zero"); } else { System.out.println("liczba " + x + " jest ujemna"); } }
Zauważmy, że ten sam efekt możemy uzyskać implementując powyższą metodę zupełnie inaczej, przykładowo:
void isPositive(int x) { if( x > 0 ) { System.out.println("liczba " + x + " jest dodatnia"); } if( x == 0 ) { System.out.println("liczba " + x + " jest równa zero"); } if( x < 0 ) { System.out.println("liczba " + x + " jest ujemna"); } }
Pierwsza forma jest naturalnie preferowana. Nie dość że jest ona zwięźlejsza w zapisie, to jeszcze potencjalnie szybciej się wykonuje, jako że mniejsza jest ilość porównań jakie należy wykonać w średnim przypadku.
Istnieje jeszcze nieco uproszczony sposób zapisu instrukcji warunkowej w przypadku gdy kod objęty instrukcją IF to pojedyńcza instrukcja. Możemy w takim przypadku pominąć nawiasy klamrowe obejmujące kod wykonywany warunkowo. Metoda isPositive(…) może więc być zapisana w postaci:
void isPositive(int x) { if( x > 0 ) System.out.println("liczba " + x + " jest dodatnia"); else if( x == 0 ) System.out.println("liczba " + x + " jest równa zero"); else System.out.println("liczba " + x + " jest ujemna"); }