GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Tanuljunk PAWN nyelvet => A témát indította: Epsilon - 2011. Március 13. - 18:09:23

Cím: [ Leírás ] Hármas operátor
Írta: Epsilon - 2011. Március 13. - 18:09:23
Az utóbbi idõben egyre több forrás kerül hozzám (a segítségek által), amelyekben az elágazásoknál csak a „berögzült” megoldást alkalmazzátok.
 
if ( x == 2 )
    SendClientMessage(playerid,COLOROM,”2”);
else
   SendClientMessage(playerid,COLOROM,”Nem2”);

 
 
Ezzel nincs semmi baj, viszont ki ne akarna magának jót?
A fenti példát meglehet oldani egy sokkal rövidebb, kényelmesebb és átláthatóbb (kinek mi..) módszerrel;
 
SendClientMessage(playerid,COLOROM,(x == 2) ? (\"2”) : (\"Nem2”));

 
 
Elsõre ez igencsak barátságtalannak tûnhet, de érdemes vele jóba lenni, mert sokszor segíthet rajtunk.
Nézzük hogyan épül fel


A funkció eleje gondolom mindenkinek még ismerõs, viszont a szöveg helyén megjelenõ zárójel már okozhat furcsa tekinteteket. A feltétel amit az elõbb if után láthattunk beépült a funkcióba. Az után ? választja el a feltétel és a két végkimenetelt. Egyik kimenetel az igaz/true: ez az elsõ. Ezt követi :-tal elválasztva a hamis/false kimenetel.
Példák


 

new bool: goodboy = true;
// .. sok minden ..
SetPlayerHealth(playerid,(!goodboy) ? 0.0 : 100.0);

 

SetPlayerColor( playerid, (Team[playerid] == TEAM_BLUE ) ? COLOR_BLUE : COLOR_RED );

 

new cash = (IsPlayerAdmin(playerid)) ? 400 : 20; 

 

SetPlayerHealth( playerid, ( IsSuddenDeathEnabled() ) ? 1.0 : 100.0 );

 

GivePlayerWeapon( playerid, ( IsMadnessEnabled() ) ? WEAPON_MINIGUN : WEAPON_FLOWER, 5000 );

 

file = fopen( ( useSpecialFile ) ? (\"special_file.txt\") : (\"normal_file.txt\") );

 


if ( ( IsPlayerAdmin( playerid ) ) ? SetPlayerPos( playerid, AdminSpawnX, AdminSpawnY, AdminSpawnZ ) : SetPlayerPos( playerid, PlayerSpawnX, PlayerSpawnY, PlayerSpawnZ ) ){}

 
 
Csak a karakterláncoknál kötelezõ a zárójelek használata! (Lásd: elsõ példa)
A végére pedig valami finomat tartogattam, még pedig azt, hogy ilyen hármas operátorokat egymásba is lehet építeni, de vigyázzatok, könnyen téveszthettek!
 
new c = random (3);
GivePlayerMoney(playerid, (c==0) ? 14524 : (c == 1) ? 42541 : (c == 2) ? 78541 : (c == 3) ? 7000 : 0);

 
 
Hozzászólásként küldjétek el, ha valamit nem értetek és kibõvítem annak megfelelõen!
Cím: [ Leírás ] Hármas operátor
Írta: ZeRo - 2011. Március 13. - 18:44:04
Errõl még anno én is akartam írni, de valahogy nem kerítettem rá sort. Szép leírás, pontos megfogalmazások, elegáns kifejezések. ;)
Csak egy szépséghiba, a logikai változó deklarációjánál kimaradt a \'d\' betû.
Cím: [ Leírás ] Hármas operátor
Írta: Epsilon - 2011. Március 13. - 18:53:48
Köszönöm, korrigálva.
Cím: [ Leírás ] Hármas operátor
Írta: kurta999 - 2011. Március 13. - 20:13:40
Szép leírás!
Én a többi helyen is használtam zárólejelek, mivel szerintem úgy átláthatóbb...
Amúgy az ugye nembaj ?
Cím: [ Leírás ] Hármas operátor
Írta: Epsilon - 2011. Március 13. - 21:11:25
Köszönöm.
Nem.
Cím: [ Leírás ] Hármas operátor
Írta: Iceaac - 2011. Március 14. - 09:04:49
The ternary operator @ http://forum.sa-mp.com/showthread.php?t=216730
Cím: [ Leírás ] Hármas operátor
Írta: Epsilon - 2011. Március 14. - 11:42:29
Kösz, kiegészítettem az ottani példákkal.
Cím: [ Leírás ] Hármas operátor
Írta: ►ѕтa - 2011. Szeptember 25. - 19:58:16
Áthelyezve, szerintem ide való.
Mellesleg jó leírás.
Cím: [ Leírás ] Hármas operátor
Írta: _I[TM]I_Dexter[CL] - 2011. November 19. - 05:23:44
Szép lett GRAT!
Cím: [ Leírás ] Hármas operátor
Írta: maark - 2012. Március 10. - 10:59:30
Ne haragudjatok a bumpért, de lenne egy kérdésem. Az egy dolog hogy egyszerûbb, de a régi módi \"if\" elágazás lassabb mint a hármas operátor?
Cím: [ Leírás ] Hármas operátor
Írta: Epsilon - 2012. Március 10. - 11:58:35
Ugyanolyan gyorsak.
A fordító ugyanolyan kóddá fordítja mind2-t.
Cím: [ Leírás ] Hármas operátor
Írta: Gang[St]e[R] - 2012. Március 10. - 12:03:05
Ugyanúgy lekérdezi mintha benne lenne a függvényben az if elágazás úgy is veheted, csak ez megoldja egy sorba.