Mam wrażenie, że błędnie rozumiesz zachowanie programu w przypadku zagnieżdżonych instrukcji if-else. Weźmy pod uwagę prostą funkcję (dla ułatwienia bez return, tylko z cout), i przeanalizujmy kilka przykładów:
void f(int n)
{
if (n >= 50)
{
if (n <= 100)
{
cout << "Podałeś liczbę z przedziału [50, 100]" << endl;
}
}
else
{
cout << "Podałeś liczbę mniejszą niż 50" << endl;
}
cout << "Koniec funkcji" << endl;
}
Gdy n = 75, program zachowa się w następujący sposób:
- Zobaczy pierwszą instrukcję if, i stwierdzi, że warunek jest spełniony, więc zawartość if-a zostanie wykonana.
- Teraz spotka drugą instrukcję if, i również stwierdzi, że warunek jest spełniony, więc zawartość if-a zostanie wykonana.
- Wypisze tekst “Podałeś liczbę z przedziału [50, 100]”.
- Jako, że warunek w pierwszym if-ie był spełniony, instrukcja else zostanie zignorowana.
- Wypisze “Koniec funkcji”.
Gdy n = 25, nasz program:
- Zobaczy pierwszą instrukcję if i stwierdzi, że warunek nie jest spełniony, więc pominie zawartość if-a.
- Jako, że pierwszy warunek nie był spełniony, zostanie wykonana zawartość else-a, tzn. zostanie wypisany tekst “Podałeś liczbę mniejszą niż 50”.
- Wypisze tekst “Koniec funkcji”.
Teraz najciekawszy przypadek gdy n = 250. Nasz program zachowa się w następujący sposób:
- Zobaczy pierwszą instrukcję if i stwierdzi, że warunek jest spełniony, więc zawartość if-a zostanie wykonana.
- Spotka drugą instrukcję if, lecz tym razem warunek nie jest spełniony, więc zawartość drugiego if-a zostanie pominięta.
- Jako, że warunek w pierwszym if-ie był spełniony, instrukcja else zostanie pominięta! Tutaj chyba warto dopowiedzieć, że druga instrukcja if (
if (n <= 100)
) nie wpływa na to, czy zawartość else-a zostanie wykonana, ponieważ drugi if jest zagnieżdżony. Generalnie zawartość else-ów zostanie wykonana tylko jeśli warunek if (lub else if) na tym samym poziomie zagnieżdżenia nie został jeszcze spełniony.
- Wypisze tekst “Koniec funkcji”.
Jeśli chcesz zobaczyć ten programik w akcji: https://ideone.com/efi9Ug