2.5.6 Sisäkkäiset ehtolauseet

Ehdon toteutuminen saattaa johtaa uusien ehtojen asettamiseen. Tällöin joudutaan kirjoittamaan sisäkkäisiä if-lauseita:

if (ehto1)
  if (ehto2)
    lause1;
  else
    lause2;
else
  lause3;

Sisäkkäisissä ehtolauseissa kannattaa käyttää kokonaisuuksien ryhmittelyyn lohkon määrääviä sulkuja {}, vaikkei niitä aina välttämättä tarvittaisikaan. Ne selkeyttävät kokonaisuutta ja vähentävät hämäriä virhetilanteita.

Jos halutaan selvittää onko positiivinen kokonaisluku parillinen vai pariton, voidaan kirjoittaa seuraava if-lause:

if (luku > 0) {
  if (luku%2 == 0)
    cout << "Parillinen luku." << endl;
  else
    cout << "Pariton luku." << endl;
}
else
  cout << "Negatiivinen luku tai nolla." << endl;

Lausekkeessa käytetään modulo-operaattoria (%), joka palauttaa jakolaskun jakojäännöksen. Parillisilla luvuilla jäännös on nolla ja parittomilla yksi.

Lausekkeen jäsennyksessä on huomattava, että else-lause liittyy aina edelliseen samassa lohkossa olevaan if-lauseeseen (siis sellaiseen, jolla ei vielä ole omaa else-osaansa). Edellä olevassa esimerkissä if- ja else-lauseiden suhde oli selkeästi osoitettu sekä sisentämällä että käyttämällä lohkosulkuja (joita ei tässä välttämättä tarvittaisi).

Lohkosulkuja kannattaa if-kokonaisuuksissa totutella käyttämään aina, jos kyseessä on vähänkin monimutkaisempi rakenne. Jos ohjelmassa esiintyy if-lauseita ilman else-osaa, voi huolimattomalla lohkosulkujen käytöllä (tai käyttämättä jättämisellä) saada aikaan tilanteita, joissa kääntäjä liittää else:n aivan eri if-lauseeseen kuin oli tarkoitus.

Esimerkki

/* *********************************************************
APIP.CPP
  Tutkitaan, onko nyt aamupäivä (7-12), iltapäivä (12-17)
  vai jotain muuta.
********************************************************* */

#include <iostream.h>

int main(void)
{
  int tunti;

  cout << "Anna tämänhetkinen tunti > ";
  cin >> tunti;

  if (tunti < 17) {
    if (tunti < 12) {
      if (tunti >= 7)
        cout << "On aamupäivä." << endl;
      else
        cout << "Ei ole aamu- eikä iltapäivä." << endl;
    }
    else
      cout << "On iltapäivä." << endl;
  }
  else
    cout << "Ei ole aamu- eikä iltapäivä." << endl;

  return 0;
}

Mieti, kuinka esimerkin ohjelman voisi toteuttaa toisin (saada kenties yksinkertaisemmaksi).

Tee ohjelma, joka kysyy käyttäjän ikää ja tulostaa iän mukaan
ikä < 15 "Olet lapsi"
15 <= ikä < 20 "Olet nuori"
ikä >= 20 "Olet aikuinen"