A InfoWiki wikiből
Egymásba ágyazott if-ek
Nincs annak sem akadálya, hogy egy if belsejébe (akkor vagy különben ágba) egy másik if-t helyezzünk. Erre gyakran van szükség, ha nem két, hanem három, vagy több lehetőség is előadódhat:
Console.WriteLine("Kérek egy számot"); int a = int.Parse(Console.ReadLine()); if (a<0) { Console.WriteLine("A szám negatív"); } else { if (a==0) Console.WriteLine("A szám nulla."); else Console.WriteLine("A szám biztosan pozitív."); }
vegyük észre, hogy egy if utasítás (a vele párban álló else utasítással, és az általuk kezelt védett utasításblokkokkal együtt) egyetlen egységnek, egyetlen utasításnak számít. Ezért az előző példában a beágyazott if-t nem kellett volna blokkokba zárni:
Console.WriteLine("Kérek egy számot"); int a = int.Parse(Console.ReadLine()); if (a<0) { Console.WriteLine("A szám negatív"); } else if (a==0) Console.WriteLine("A szám nulla."); else Console.WriteLine("A szám biztosan pozitív.");
Vagy, más tördelésben:
Console.WriteLine("Kérek egy számot"); int a = int.Parse(Console.ReadLine()); if (a<0) Console.WriteLine("A szám negatív"); else if (a==0) Console.WriteLine("A szám nulla."); else Console.WriteLine("A szám biztosan pozitív.");
Ezzel egyszerűen kezelhető a sok elágazási ág problémája is:
Console.WriteLine("Írd be az érdemjegyed:"); int a = int.Parse(Console.ReadLine()); if (a==1) Console.WriteLine("elégtelen"); else if (a==2) Console.WriteLine("elégséges"); else if (a==3) Console.WriteLine("közepes"); else if (a==4) Console.WriteLine("jó"); else if (a==5) Console.WriteLine("jeles"); else Console.WriteLine("nana, viccelsz, ugye?!");
Ez a tördelés helyes, de lényegében sok szinten egymásba ágyazott if-eket rejt:
Console.WriteLine("Írd be az érdemjegyed:"); int a = int.Parse(Console.ReadLine()); if (a==1) Console.WriteLine("elégtelen"); else { if (a==2) Console.WriteLine("elégséges"); else { if (a==3) Console.WriteLine("közepes"); else { if (a==4) Console.WriteLine("jó"); else { if (a==5) Console.WriteLine("jeles"); else Console.WriteLine("nana, viccelsz, ugye?!"); } } } }
Csellengő else probléma
Gyakori eset, amikor két if követi egymást, pl az alábbi módon:
Console.WriteLine("Írj be egy számot:"); int a = int.Parse(Console.ReadLine()); if (a>=0) if (a%2==0) Console.WriteLine("ez páros szám"); else Console.WriteLine("ez negatív szám");
A fenti esetben felmerül egy probléma, amelyet csellengő else problémának szoktunk nevezni. A kérdés ugyanis az, hogy a fenti esetben az else ág melyik if-hez tartozik!? Ugyanis a tördelés (és az konzol kiírás) azt sugallja, hogy ez az első if-hez tartozik, amely azt vizsgálja, hogy a szám kisebb-e mint nulla (negatív-e). De nem!
A csellengő else problémában szereplő esetekben az else mindíg a hozzá közelebb álló if-hez tartozik. A fenti kód a valódi működésének, értelmezésének megfelelő tördelésben a következőképpen fest:
Console.WriteLine("Írj be egy számot:"); int a = int.Parse(Console.ReadLine()); if (a>=0) { if (a%2==0) Console.WriteLine("ez páros szám"); else Console.WriteLine("ez negatív szám"); }
Amennyiben a korábbi működést szeretnénk elérni, úgy a következőképpen kell eljárni:
Console.WriteLine("Írj be egy számot:"); int a = int.Parse(Console.ReadLine()); if (a>=0) { if (a%2==0) Console.WriteLine("ez páros szám"); } else Console.WriteLine("ez negatív szám");
Vegyük észre, hogy pozitív páratlan esetben (pl +3) a fenti program nem ír semmit ki a képernyőre. Persze helyesebb lenne ezt a következőképpen írni:
Console.WriteLine("Írj be egy számot:"); int a = int.Parse(Console.ReadLine()); if (a>=0) { if (a%2==0) Console.WriteLine("ez páros szám"); else Console.WriteLine("ez páratlan"); } else Console.WriteLine("ez negatív szám");