ternary conditional operator (tsz. ternary conditional operators)
A ternary operátor így néz ki:
feltétel ? igaz_érték : hamis_érték;
Itt: - feltétel – egy logikai kifejezés, amely kiértékelésre kerül. - igaz_érték – ha a feltétel igaz (true
), ezt az értéket veszi fel a kifejezés. - hamis_érték – ha a feltétel hamis (false
), ezt az értéket veszi fel a kifejezés.
Hagyományos if-else használat:
#include <iostream>
using namespace std;
int main() {
int x = 10, y = 20;
int nagyobb;
if (x > y)
nagyobb = x;
else
nagyobb = y;
cout << "A nagyobb szám: " << nagyobb << endl;
return 0;
}
Ternary operátorral ugyanez:
#include <iostream>
using namespace std;
int main() {
int x = 10, y = 20;
int nagyobb = (x > y) ? x : y;
cout << "A nagyobb szám: " << nagyobb << endl;
return 0;
}
Látható, hogy a kód tömörebb és átláthatóbb lett.
A ternary operátor egymásba ágyazható. Példa:
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 20, c = 30;
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
cout << "A legnagyobb szám: " << max << endl;
return 0;
}
Ez a kód három szám közül a legnagyobbat határozza meg. Ha a nagyobb b-nél, akkor még c-vel is összehasonlítja, és eldönti, hogy a vagy c a legnagyobb. Ha b nagyobb a-nál, akkor b és c közül választja ki a legnagyobbat.
Példa:
int szam = 5;
string eredmeny = (szam % 2 == 0) ? "Páros" : "Páratlan";
cout << eredmeny;
Ez a program eldönti, hogy egy szám páros vagy páratlan, és az eredményt egy string változóban tárolja.
Használható függvény visszatérési értékének meghatározására:
#include <iostream>
using namespace std;
string paritas(int szam) {
return (szam % 2 == 0) ? "Páros" : "Páratlan";
}
int main() {
int x = 7;
cout << x << " -> " << paritas(x) << endl;
return 0;
}
Ha egy logikai változót szeretnénk egy másikhoz rendelni:
bool feltetel = true;
string uzenet = feltetel ? "Elfogadva" : "Elutasítva";
cout << uzenet;
Ha a feltetel
true, akkor “Elfogadva”, egyébként “Elutasítva” lesz az érték.
Nehezen olvasható, ha túl komplex
Ha túl sok ágyazott ternary operátor van, a kód olvashatatlanná válik. Példa egy kerülendő kódra:
string eredmeny = (a > b) ? ((a > c) ? "A" : "C") : ((b > c) ? "B" : "C");
Helyette jobb egy normál if-else
szerkezetet használni.
Csak egyszerű kifejezésekre ajánlott
Nem használható komplex logikai műveletek helyett.
Bizonyos helyzetekben a teljesítmény csökkenhet
Ha az igaz és hamis ágak bonyolult műveleteket tartalmaznak, a ternary operátor nem mindig hatékony.
Lehet pointerekkel is használni:
int a = 10, b = 20;
int* ptr = (a > b) ? &a : &b;
cout << "A nagyobbik cím: " << ptr << ", érték: " << *ptr;
Itt a ptr
a nagyobb szám memóriacímét fogja tárolni.
if constexpr
(C++17)C++17-től van egy alternatíva az if constexpr
segítségével:
constexpr int max(int a, int b) {
return (a > b) ? a : b;
}
Ez fordítási időben kiértékelődik, így hatékonyabb lehet bizonyos esetekben.
if-else
szerkezetre.feltétel ? igaz_érték : hamis_érték;