Podręcznik

6. Instrukcje warunkowe

W celu implementacji bardziej rozbudowanej aplikacji, oprócz wypisywania na ekranie oraz pobierania danych od użytkownika, konieczne jest podejmowanie różnych decyzji w aplikacji. Decyzje prowadzą do selektywnego wywoływania operacji w zależności od spełnienia lub nie określonego warunku. 
Ogólna postać instrukcji warunkowej jest następująca:

if (warunek) 
     instrukcja_1;    // wykonywana, jeśli warunek jest spełniony
 else 
     instrukcja_2;  // wykonywana w przeciwnym przypadku
Zdefiniowana instrukcja warunkowa oznacza, że w przypadku gdy warunek zostanie spełniony powinna być wykonana instrukcja_1. Jeżeli warunek nie zostanie spełniony zostanie wykonana instrukcja_2.

Poniżej przedstawiono prostą symulację działania instrukcji warunkowej, która umożliwia sprawdzenie działania operacji warunkowej dla wybranej wartości całkowitej. Po prawej stronie wyświetlane jest wyjście (wynik działania aplikacji).
Wybierz wartość zmiennej x i zobacz, jak działa warunek if w C++ z animacją.
int x = ...;  // Aktualna wartość: ...
if (x > 0) {
    cout << "x jest większe od 0" << endl;
} else {
    cout << "x nie jest większe od 0" << endl;
}
Instrukcja else nie jest obligatoryjna możliwe jest zastosowanie skróconej wersji instrukcji warunkowej if.
Skrócona wersja instrukcji warunkowej ma postać:

if (warunek) 
     instrukcja_1    // wykonywana, jeśli warunek jest spełniony
Każda z instrukcji występujących w konstrukcji if musi być jedną instrukcją (chociaż taka jedna instrukcja może być bardzo długą i skomplikowaną instrukcją strukturalną).
Przedstawiona uwaga oznacza, że do instrukcji warunkowej if możemy przypisać tylko jedną instrukcję, która znajduje się bezpośrednio pod nią. To samo dotyczy instrukcji else. Możemy to zobrazować za pomoca kodu umieszczonego poniżej.
if (a>0) cout << a;
else
    cout << "zmieniamy znak";
    cout << -a;
W przedstawionym przykładzie do instrukcji if należy cout << a; natomiast do instrukcji else należy cout << "zmieniamy znak";. Instrukcja cout << -a; nie należy do instrukcji else. Jest więc niezależna od warunku (a>0) i wykona się zawsze.

Jeżeli chcemy wywołać więcej instrukcji niż jedną należy zastosować instrukcję blokową albo instrukcję złożoną. Instrukcja oznacza wykorzystanie nawiasów klamrowych {}, pomiędzy którymi możemy umieścić wiele instrukcji. Instrukcja blokowa jest traktowana jak jedna instrukcja, więc możemy ją przypisać do instrukcji warunkowej if lub else. Możemy więc tworzyć instrukcje warunkowe typu:
if (warunek)
{
   ...
   ...
}
    
lub
if (warunek)
{
    ...
} else {
    ...
}
    
Instrukcja blokowa może być dowolnie zagnieżdżana.
Każda z instrukcji należących do instrukcji if także może być instrukcją if. Wtedy instrukcję taką nazywamy zagnieżdżoną.
Poniżej przedstawiony jest przykład zagnieżdżonej instrukcji if.
if (...)
   ...
else if (...)
    ...
else
    ...
Przyjmuje się, że else zawsze należy wiązać z najbliższym mu wstecz if-em. Możemy więc zapisać:

if (...)
    if (...)
       ...
    else
       ...
    
Jeżeli chcielibyśmy, aby else w tej konstrukcji należał do pierwszego if-a, musimy zastosować instrukcję blokową:
if (...)
{
    if (...)
        ...
} else
    ...
Oczywiście nie jest konieczne stosowanie zawsze instrukcji blokowej. Należy jednak pamiętać, że bez stosowania nawiasów klamrowych tylko jedna instrukcja znajdująca się za instrukcją if lub else zostanie do niej przypisana. Jeżeli chcemy mieć większą kontrolę nad wywołaniem kodu możemy stosować nawiasy klamrowe. Zwłaszcza w wypadku gdy nie jesteśmy pewni w jaki sposób zostanie zinterpretowany kod.