next up previous contents
Elõre: Ciklusszervezõ utasítások Fel: Utasítások Vissza: Kifejezés-utasítások

A feltételes utasítás

A feltételes utasításnak két formája létezik:

  if (kifejezés) utasítás vagy blokk

illetve

  if (kifejezés) utasítás vagy blokk  else utasítás vagy blokk

Mindkét forma végrehajtása a kifejezés kiértékelésével kezdõdik, és ha az igaz (nem 0), akkor az elsõ utasítás vagy blokk kerül végrehajtásra. A második formánál megadott második utasításra vagy blokkra akkor kerül a vezérlés, ha a kifejezés hamis (0 értékû). A pelda.c-ben szereplõ feltételes utasítás:

            if (isupper(c))
            {
               c = tolower(c);
            } 
            else
            {
               c = toupper(c);
            }
esetén a feltétel - isupper(c) - azt adja meg, hogy a c változóban lévõ karakter az angol ABC nagybetûje-e vagy sem. Ha a karakter nagybetû, akkor a c = tolower(c); utasítás segítségével a kisbetûs párjával helyettesítõdik, ha nem, akkor a c = toupper(c) utasítás csinál a kisbetûkbõl megfelelõ nagybetûket. Figyeljük meg, hogy bár mind az igaz, mind a hamis ág egyetlen utasításból áll, mégis blokkba foglaltuk õket. Ez nem kötelezõ, de az a meggyõzõdésünk, hogy ezzel a stílussal olvashatóbb, hibavédettebb programokat írhatunk. Mindenki igazat fog nekünk adni, aki - hozzánk hasonlóan - csak egyszer is keresett ilyenfajta hibát:
            if (isupper(c))
               c = tolower(c);
            else
               c = toupper(); fugg(c);
ugyanis ez a programrészlet - az írásmóddal is jelölt - szándékunk ellenére a fugg függvényt minden esetben meghívja. A másik hasonló hiba:
            if (a > b)
               if (a > amax)
                  amax = a;
            else
               if (b > bmax)
                   bmax = b;
Az elõbbi kódrészlet elsõ ránézésre arra szolgál, hogy kiválasszuk a és b közül a nagyobbat, majd azzal - bizonyos feltételek tejesülése esetén - a megfelelõ változót felülírjuk. A kódrészletet azonban a fordító így értelmezi:
            if (a > b)
               if (a > amax)
                  amax = a;
               else
                  if (b > bmax)
                     bmax = b;
ami teljesen mást jelent (például bmax csak úgy kaphat értéket, hogy a>b teljesül). Ennek oka az, hogy a fordító minden else-t a legközelebbi, õt megelõzõ, else nélküli if-hez kapcsolja. Ha azonban az általunk javasolt, blokkos formát alkalmazzuk
            if (a > b)
            {
               if (a > amax)
               {
                  amax = a;
               } /* endif a>amax */
            } 
            else
            {
               if (b > bmax)
               {
                  bmax = b;
               } /* endif b>bmax */
            } /* endif a>b */
akkor a fenti hibákat nem követhetjük el. A blokkzáró } után álló megjegyzések összetett vezérlési szerkezetek esetén jelentenek hasznos fogódzkodót.