Ternary operátor
A tavaszi C# alapozó bootcampünk tananyagait továbbra is megvásárolhatod! Bár az élő előadásokon már túl vagyunk, az összes előadás anyaga továbbra is visszanézhető!
Irány a bootcampAz előző anyagból megtanultuk, hogy miként tudjuk az algoritmusunk egy részének a futtatását feltételekhez kötni, megismerkedtünk az if... else... vezérlési szerkezet működésével. Vannak azonban olyan esetek, amikor ennél rövidebb megoldást is választhatunk hasonló célokra, ez a megoldás az ún. ternary operátor. Nézzünk egy példát ennek az alkalmazására. Tegyük fel, hogy szeretnénk készíteni egy olyan függvényt, ami visszaadja egy szám abszolútértékét.
Mint tudjuk, egy szám abszolútértéke az adott szám nullától való távolsága. Most gondoljuk át, hogy miként tudnánk ezt a feladatot megoldani. Ha a számunk értéke 0, vagy pozitív, akkor a szám abszolútértéke önmaga lesz. Ha a számunk negatív, akkor pedig az abszolútértéke önmaga ellentettje lesz. Lényegében tehát a +3 abszolútértéke a +3, míg -5 abszolútértéke a +5. A folyamat tehát:
- Ha a szám kisebb mint 0
- A szám abszolútértéke az ellentettje
- Különben
- A szám abszolútértéke önmaga
Az algoritmus tökéletesen működik. Azonban abban az esetben, ha egy változónak szeretnénk egy feltétel alapján értéket adni, használhatjuk például a ternary
operátort. (Lentebb más felhasználási területére is vetünk majd egy pillantást) Ez az operátor három kifejezést foglal magában, az alábbi formában:
kif1 ? kif2 : kif3
, és úgy működik, mint egy leegyszerűsített if.
Először minden esetben a kif1 kifejezés kerül kiértékelésre, majd a program megnézi ennek a kifejezésnek az értékét. Ha ez az érték IGAZ (vagy egyéb nem nulla érték - erre később még visszatérünk), akkor ezt követően a kif2 kifejezést értékeli ki és adja vissza, ha pedig hamis, akkor a kif3 kifejezés kerül kiértékelésre és visszaadásra. Ez első körben elég furán hangozhat, nézzük meg, hogy hogy is működik a gyakorlatban, egy példakódon keresztül.
int n;
Console.WriteLine("Írj be egy egész számot!");
n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine( n<0 ? -n : n );
Ez az egyik leggyakoribb felhasználási területe a ternary operátornak. Mint láthatjuk, tulajdonképpen a funkciója ugyanaz, mint egy sima if... else...-nek,
mindössze a szintaxisa valamivel rövidebb, ami megkönnyítheti a kód átláthatóságát egyes esetekben. Gyakori felhasználási területe még logikai értékek olvasható
szöveggé való átalakítása, például allitas?"Az állítás igaz":"Sajnos az állítás hamis"
.
Van azonban néhány dolog, amire a használata során figyelni kell! Egyrészt ne feledkezzünk meg arról, hogy az operátorok végrehajtásánál (épp úgy, mint a matematikai műveleteknél) van egy bizonyos végrehajtási sorrend (precedencia). A legegyszerűbb megoldás az, ha a ternary operátorunkat mindig betesszük egy zárójelbe, így nagy meglepetés igazából nem érhet bennünket.
A másik dolog amire figyelni érdemes, az adattípusok. A ternary operátor C#-ban a második kifejezés alapján dönti el, hogy milyen típusú visszatérési értéket
fog adni. Ha tehát a második és a harmadik kifejezés nem azonos típust ad vissza, például feltetel?"alma":12
, akkor bármelyik ág is fut le, mivel a
második kifejezés szöveg, a visszatérési érték is szöveg lesz (azaz a 12-t nem int-ként hanem string-ként kapjuk vissza). Ha a konvertálás nem lehetséges, a program
hibát dob.
A legbiztosabb tehát, ha az operátort zárójelbe tesszük és a második és a harmadik kifejezés adattípusa megegyezik (tehát pl. mindkettő int, vagy mindkettő szöveg, stb.).
Próbáld ki magad is! Nézd át a cikkünkhöz tartozó mintakódot - szerkeszd és futtasd közvetlenül a böngésződben, az info9 LineFlame fejlesztőeszközével!
Ha megértettük a ternary operátor működését, íme néhány példafeladat hozzá:
- TO01: Kérjünk be egy számot a felhasználótól, és írjuk ki, hogy a szám nagyobb-e mint 5. Kiíráskor használjuk az "igen, nagyobb" és a "nem, kisebb" kifejezéseket!
- TO02: Kérjünk be két számot a felhasználótól, és írjuk ki közülük a nagyobbat.
Olyan feladatokat, amelyekhez ternary operátor és ciklusok egyaránt szükségesek, a ciklusok alatt találhatsz.