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.