Tie koodariksi

C++-ohjelmointi

Luku 4: Totuusarvot ja ehdot

Totuusarvot

Totuusarvo on joko true (tosi) tai false (epätosi). Esimerkiksi seuraava koodi määrittelee totuusarvomuuttujan (tyyppi bool) ja asettaa siihen arvon true:
bool x = true;
Totuusarvo myös vastaa lukua niin, että true on 1 ja false on 0. Toisaalta mikä tahansa lukuarvo voidaan tulkita totuusarvona: luku 0 on false ja kaikki muut luvut ovat true.

Totuusarvoiset lausekkeet

Totuusarvoinen lauseke syntyy usein vertailusta. C++:ssa käytössä ovat tavalliset vertailuoperaattorit ==, !=, <, <=, > ja >=. Esimerkiksi lauseke a+b == c on tosi, jos a+b ja c ovat yhtä suuret.

Tavalliset loogiset operaattorit ovat && (ja) sekä || (tai). Esimerkiksi lauseke x >= 3 && x <= 8 on tosi, jos x on välillä 3...8. Lisäksi operaattori ! lausekkeen edessä muuttaa sen totuusarvon käänteiseksi. Esimerkiksi lausekkeet x > 5 ja !(x <= 5) tarkoittavat samaa.

Voimme selventää totuusarvoisen lausekkeen tulkintaa sulkujen avulla. Esimerkiksi lauseke x%4 == 0 && (x%100 != 0 || x%400 == 0) on tosi silloin, kun x on karkausvuosi. Lauseke vaatii, että x on jaollinen 4:llä ja lisäksi jos x on jaollinen 100:lla, se on jaollinen myös 400:lla.

Totuusarvoisen lausekkeen osat käydään läpi vasemmalta oikealle, ja jos tulos on jo selvä, jäljellä olevia osia ei tarkasteta. Esimerkiksi lausekkeen b != 0 && a/b == 2 osaa a/b == 2 ei tarkasteta, jos b == 0, koska tulos on varmasti false. Niinpä ei haittaa, vaikka osassa a/b == 2 odottaisi nollalla jakaminen.

Ehtolause

C++:ssa ehtolauseen perusrakenne on:
if (ehto) {
    koodi
}
Tässä ehto on jokin totuusarvoinen lauseke. Jos ehto pätee, suoritetaan lohkossa oleva koodi, ja muuten ei tapahdu mitään. Voimme myös lisätä toisen haaran:
if (ehto) {
    koodi1
} else {
    koodi2
}
Nyt jos ehto pätee, suoritetaan koodi 1, ja muuten suoritetaan koodi 2.

Tavallinen tapa on ketjuttaa ehtoja näin:

if (ehto1) {
    koodi1
} else if (ehto2) {
    koodi2
} else if (ehto3) {
    koodi3
...
}
Tämä koodi käy läpi ehtoja ja suorittaa ensimmäisen koodin, jota edeltävä ehto pätee.

Esimerkki

Seuraava ohjelma kysyy käyttäjän iän ja tulostaa viestin sen perusteella:
int ika;
cout << "Kuinka vanha olet? ";
cin >> ika;
if (ika < 0 || ika > 120) {
    cout << "Mahdotonta";
} else if (ika < 18) {
    cout << "Olet alaikäinen";
} else {
    cout << "Olet aikuinen";
}
Jos ikä on alle 0 tai yli 120, viestinä on "Mahdotonta". Muuten ohjelma tulostaa "Olet alaikäinen", jos ikä on alle 18, tai "Olet aikuinen", jos ikä on ainakin 18.

Ohjelman suoritus voi näyttää seuraavalta:

Kuinka vanha olet? 10
Olet alaikäinen

Merkinnät = ja ==

Merkintöjen = ja == välillä on tärkeä ero: = asettaa muuttujan arvon, kun taas == vertailee arvoja.

Tavallinen ohjelmointivirhe on kirjoittaa ehdossa ==:n sijasta =:

if (x = 5) {
    cout << "apina";
}
Tässä ehtona on lauseke x = 5 eli muuttujan asetus. Lausekkeen arvo on 5, joka on tosi, koska kaikki luvut paitsi 0 ovat tosia. Niinpä ehto on aina tosi, eli koodi tulostaa aina "apina".

Yksi lause lohkossa

Jos lohkon sisällä on vain yksi lause, lohkoa ei tarvita vaan lauseen voi kirjoittaa suoraan ilman merkkejä { ja }. Esimerkiksi seuraavat koodit toimivat samalla tavalla:
if (x == 5) {
    cout << "apina";
}
if (x == 5) cout << "apina";
Seuraava koodi ei toimi niin, kuin ehkä voisi kuvitella:
if (x == 5)
    cout << "apina";
    cout << "banaani";
Koska lohkoa ei ole, ehto vaikuttaa vain seuraavaan lauseeseen eli koodi vastaa tätä:
if (x == 5) {
    cout << "apina";
}
cout << "banaani";

Ehdollinen lauseke

Ehdollinen lauseke a ? b : c saa arvon b, jos ehto a pätee, ja muuten arvon c. Ehdollista lauseketta voi käyttää vaikkapa näin:
int s = x%2 == 0 ? 5 : 8;
Tämä vastaa seuraavaa koodia:
int s;
if (x%2 == 0) {
    s = 5;
} else {
    s = 8;
}