Utolsó frissítés: 2012.02.13.
Facebook Twitter iWiW MySpace Digg Delicious Google bookmarks Startlap Windows Live

Operátorok I.

Valószínűleg azt gondolod (még akkor is, ha rendesen megcsináltad a házi feladatokat :D), hogy még semmilyen értelmesnek nevezhető PHP program nem volt ezen a tanfolyamon (hasznos meg pláne nem...)! De ahogy a bevezetőben is említettem, igazán hasznos programok csak a tanfolyam második részében lesznek (űrlapok). Mellesleg ami eddig a PHP tanfolyamon történt, az tulajdonképpen nem is nevezhető igazán programozásnak még akkor sem, ha némelyik rész csak harmadik olvasásra vált érthetővé (vagy még akkorra se...). A mostani után következő anyaggal fogunk igazán belevágni a programozásba, amikor a ciklusok kerülnek sorra, és akkor remélhetőleg érthetővé is fog válni (legalább részben) hogy egyáltalán mire jó a PHP. Ahhoz azonban hogy elkezdhessünk ciklusokat gyártani, előbb meg kell ismerkednünk a legalapvetőbb operátorokkal (magyarul műveleti jelekkel)!

Operátoroknak nevezzük az olyan műveleti jeleket, amelyekkel a változókat tudjuk kezelni (értéket adni nekik, megváltoztatni őket). Az operátorok változókat vagy változókból álló kifejezéseket várnak, és ezekkel tudnak különféle műveleteket végezni. Azt a kifejezést, amit a változó használ, operandusnak nevezzük. Pl. az összeadás operátora esetén a 43+8 esetben két operandus van: a 43-as és a 8-as szám. Az operátorok csoportosíthatók aszerint hogy hány operandust várnak: a PHP nyelvben vannak egy-, két- és háromoperandusú operátorok (az összeadás operátora például kétoperandusú). Az alábbiakban egy másik csoportosítást láthattok, az operátor által végzett művelet típusa alapján. Itt most csak a legfontosabb operátorokat ismerjük meg, amelyekre a későbbiekben szükségünk lesz!

Értékadó operátorok

A cím szerint többféle is létezik, mi azonban csak eggyel foglalkozunk, amelyikkel legelőször megismerkedtünk, az = (egyenlőségjel) operátorral. Használata:
változó = kifejezés
Az operátornak 2 operandusa van, melyek általában nem felcserélhetőek egymással (néha nyelvtani hibát is okozhat, pl. 5 = $a;). A bal oldalon mindig változónak kell állnia, a jobb oldalon pedig egy ismert értékű kifejezésnek! Hatására a változóba bekerül a kifejezés értéke.
Többszörös értékadás is megengedett:

$a = $b = $c = 3;

Ilyenkor az utolsó helyen álló kifejezés értékét veszi fel az összes változó, vagyis a fenti kifejezés az alábbival egyenértékű:

	$a = 3;
	$b = 3;
	$c = 3;

Aritmetikai operátorok

Ennek hívjuk a matematikai alapműveletek operátorait: + - * /
Mindegyik kétoperandusú, és ugyanúgy használjuk őket mint a matekban. A két operandusnak két számnak kell lennie (ha nem az, akkor általában átkonvertálódik), a teljes kifejezés eredménye pedig szintén egy szám, ami felhasználható értékadásra, kiírásra, újabb operandusként stb. Például:

	$a = 15 - 12;    // $a = 3
	$b = $a * 3;     // $b = 9
	$c = 18 / $a;    // $c = 6

(Ahogy a legutóbbi alkalommal említettem, a // után írt sor csak megjegyzés!)
Az 1. sorban a 15-12 kifejezést értékadásra használtuk, a 2.-ban és 3.-ban pedig ugyanezt (ez került be az $a változóba) operandusként. Tetszőlegesen bonyolult kifejezések is építhetők ezekből, azonban vigyázzunk arra, hogy a műveletek sorrendje ugyanúgy van meghatározva mint a matematikában: először a szorzás-osztás, utána az összeadás-kivonás hajtódik végre. A műveleti sorrend zárójelezéssel változtatható meg, pl.:

	$a = 2+3*2;                 // $a = 2+(3*2) = 8
	$b = ($a-1)/7;              // $b = 7/7 = 1
	$c = 3*2/3-4/2*2*3;         // $c = ((3*2)/3)-(((4/2)*2)*3) = -10
	$d = 3*((2/(3-4))/2)*(2*3); // $d = (3*((2/(3-4))/2))*(2*3) = -18

A 3. sor alapján jól látható, hogy egyenrangú műveletek (pl. szorzás és osztás vagy két szorzás) közül az hajtódik végre előbb, amelyik előbb van a sorban (balról-jobbra hajtódik végre), pl. a 3+1-4 kifejezés a (3+1)-4 kifejezéssel egyenértékű, nem pedig a 3+(1-4) -gyel! Természetesen az összeadás és szorzás két operandusa egymással felcserélhető (pl. 2+5 és 5+2 egyenértékű), de a kivonás és osztás operandusai általában nem.
A - operátor egyoperandusú előtagként is használható a negatív számok jelölésére, pl. a -3 kifejezés a 0-3 rövidebb alakjaként fogható fel:

$e = ((-6)*2)/(1+(-4));   // $e = 4

A negatív számokat nem lenne muszáj zárójelbe tenni, mivel az egyoperandusú - operátor szorosabban köt mint a többi aritmetikai művelet, viszont zárójelek nélkül a kifejezés kevésbé olvasható:

$e = -6*2/(1+-4);   // $e = 4 itt is, de ez nehezebben olvasható

Növelő/csökkentő operátorok

Egy változót 1-gyel növelhetünk illetve csökkenthetünk az alábbi kifejezésekkel:

	$n = $n + 1;    // $n értéke 1-gyel nő
	$n = $n - 1;    // $n értéke 1-gyel csökken

Az 1-gyel való növelés/csökkentés olyan gyakran fordul elő a programozásban, hogy a kényelmesebb jelölés kedvéért külön operátort találtak ki erre a feladatra. Az egyoperandusú ++ és -- operátorokat használhatjuk erre, az alábbi módon:

	++$n;    // $n értéke 1-gyel nő
	--$n;    // $n értéke 1-gyel csökken

Ezeket az operátorokat bonyolultabb kifejezésekkel kombinálva is használhatjuk, de ilyenekről csak később lesz szó.

Összefűző operátor

Gyakran használatos a karakterláncok összefűzésére való . (pont) operátor. Két karakterlánc operandusa van, és hatására azok összefűződnek, pl.:

$jatek = "Gene"."Rally";    // $jatek = "GeneRally"

Ez az operátor az aritmetikai operátorokhoz hasonlóan balról jobbra hajtódik végre (bár ez itt lényegtelen) és egymás után többször is használható:

	$a = '<font color="red">';
	$szam = 36;
	$b = '</font>';
	$kiirando = $a.$szam.$b;    // $kiirando = '<font color="red">36</font>'

Mint ahogy arra egyszer már utaltam, a 36-os szám itt automatikusan a "36" karakterlánccá konvertálódik. Ha ki akarjuk írni a fent létrehozott karakterláncot, akkor nem kell külön változóba rakni, mivel a print utasítás után tetszőlegesen bonyolult kifejezéseket is írhatunk:

	$x = 4;
	print (2 - $x) / 2 + $x;    // print 3;
	print $a.$szam.$b;

Az utolsó sor a fentebb létrehozott változókkal a print '<font color="red">36</font>'; utasítást jelenti.
Az összefűző operátor két operandusa általában nem cserélhető fel egymással, mivel akkor fordítva fűzi össze a karakterláncokat:

$jatek = "Rally"."Gene";    // $jatek = "RallyGene"

A fent említett operátorok keverve is használhatóak, de ha nem vagyunk biztosak a műveletek sorrendjében akkor figyeljünk a megfelelő zárójelezésre:

	$x = 6;
	$y = 2;
	$szoveg = "eredménye: ";
	print $x."/".$y."+5 ".$szoveg.(($x/$y)+5)."<br />";

Ez az alábbi HTML kódot gyártja le:

6/2+5 eredménye: 8<br />

Házi feladat

Mivel múltkor nem adtam házit, most duplán bepótolom! Az első amolyan gondolkodtatós feladat, a másodikban kell csak programot írni.

1.) Fentebb az alábbiakat írtam:
-Az értékadó = operátor operandusai általában nem cserélhetőek fel egymással!
-A kivonás és osztás operandusai általában nem cserélhetőek fel egymással!
-Az összefűző operátor két operandusa általában nem cserélhető fel egymással!
Vajon mik lehetnek azok a kivételes esetek, amikor ezek mégis felcserélhetőek?
(Segítség: gondolkozzunk el azon hogy egyáltalán mit jelent az, hogy két operandus felcserélhető!)

Megoldás

Az, hogy egy operátor operandusai felcserélhetőek azt jelenti, hogy az eredmény ugyanaz marad a felcserélés után.
Ha a kivonás operandusait felcseréljük, akkor az eredmény a (-1)-szeresére változik. Nyilván akkor cserélhetőek fel, ha az eredmény (-1)-szerese önmaga. Csak egy ilyen szám van, a nulla. A kivonás eredménye pedig akkor nulla, ha a két szám egyenlő. A kivonás operandusai tehát akkor cserélhetőek fel, ha azok egyenlők! Hasonló gondolatmenetet végezhetünk el az osztás esetén: ha az operandusokat felcserélem, az eredmény az eredeti reciproka lesz (vagyis ha az eredmény x, akkor a felcserélés után 1/x). Egy kis számolással megállapítható (ezt most nem részletezem), hogy ha a két operandus a és b, akkor cserélhetőek fel osztás esetén, ha a = b vagy a = -b (vagy egyenlők, vagy egyik a másik (-1)-szerese).
Az értékadó operátornál kicsit más a helyzet, itt nyelvtani szabályok alapján dönthető el, hogy mikor cserélhetőek fel az operandusok. Ebben a tananyagban ezt írtam: A bal oldalon mindig változónak kell állnia, a jobb oldalon pedig egy ismert értékű kifejezésnek! Legyen a teljes kifejezés a = b alakú. Ezek szerint a két operandus akkor cserélhető fel, ha b egy változó neve, a pedig egy kifejezés, ugyanis ekkor a felcserélt változat eleget tesz a szabálynak. De hogy az eredeti a = b alak is helyes legyen, a-nak is egy változó nevének kell lennie. Ez azonban még mindig nem elegendő, ugyanis a felcserélés előtt a-ba kerül a b értéke, a felcserélés esetén pedig fordítva. Tehát csak akkor érjük el a végén ugyanazt az eredményt, ha a és b változók nevei, valamint már az értékadás előtt is kaptak értéket, méghozzá ugyanazt. Ilyenkor persze ez az értékadás nem csinál semmit, de csak ebben az esetben cserélhető fel.
Az összefűző operátor operandusai karakterláncok, ezek sorrendje nyilván akkor cserélhető fel, ha a két karakterlánc azonos (betűről betűre megegyeznek).

2.) Írjuk át a hatványozó program második változatát az összefűző operátort használva!
(A hatványozó program a 3. lecke végén van)

Megoldás

Az eredeti program (HTML kódok és megjegyzések nélkül):

		$szam = 3;
		$hatvany = $szam;
		print $szam;
		print " hatványai: ";
		print $hatvany;
		print ", ";
		$hatvany = $hatvany * $szam;
		print $hatvany;
		print ", ";
		$hatvany = $hatvany * $szam;
		print $hatvany;
		print ", ";
		$hatvany = $hatvany * $szam;
		print $hatvany;
		print ", ...";

Az összefűző operátorral az egymás utáni print utasítások egyetlen utasítássá tömöríthetőek:

		$szam = 3;
		$hatvany = $szam;
		print $szam." hatványai: ".$hatvany.", ";
		$hatvany = $hatvany * $szam;
		print $hatvany.", ";
		$hatvany = $hatvany * $szam;
		print $hatvany.", ";
		$hatvany = $hatvany * $szam;
		print $hatvany.", ...";