Készítette: Nagy Tibor István
Operátorok Műveletek Egy (vagy több) műveleti jellel írhatók le A műveletet operandusaikkal végzik Operátorok fajtái operandusok száma szerint: egyoperandusú operátorok (pl.: előjel, ++, --) kétoperandusú operátorok (pl.: +, -, *, /) háromoperandusú operátor (? : ) Operandus lehet: literál, változó, függvényhívás, vagy egy összetett kifejezés
Kifejezések A kifejezés tetszőleges számú operátorból és azok operandusaiból áll Példa: (1 + 8 a) * (25 + b) / int.parse(console.readline()) A kifejezésben lévő műveletek elvégzése (kifejezés kiértékelése) után kiszámolt eredmény a kifejezés értéke (1 + 9) / 2 2 = 3 A kiszámolt eredmény típusa az operandusoktól függ (1 + 9) / 2 2 = 3. Típusa: int.
Kifejezés kiértékelése A kifejezés értékének kiszámítása A kifejezésben található műveletek megfelelő sorrendben történő elvégzése az operátorok precedenciája határozza meg a magasabb precedenciájú operátor előbb értékelődik ki azonos precedenciájú operátoroknál balról jobbra történik a kiértékelés a precedencia módosítható zárójelezéssel Az operátor és operandusai minden lépésben helyettesítődnek az operátor eredményével 3 + 4 * 5 2. 1. 3 + 2 1 1. 2. (3 + 4) * 5 1. 2.
Kifejezés kiértékelése Egy operátor kiértékelése az operandusaiból a megfelelő művelet elvégzésével történik Ez csak konkrét értékekkel lehetséges, ezért: ha az operandus egy változó, akkor a neve a változóban tárolt értékkel helyettesítődik int i = 4; int j = 3 + 2 * i int j = 3 + 2 * 4; ha az operandus egy függvényhívás, akkor a függvény neve helyettesítődik a végrehajtása után előállított értékkel double j = 10 * Math.Sin(3.14); double j = 10 * 0;
Kifejezés kiértékelése Példa int a = 8; int b = 6; a 12 * (b + 2) + 25 3. 2. 1. 4. a 12 * (6 + 2) + 25 a 12 * 8 + 25 a 96 + 25 8 96 + 25-88 + 25-63 int a = 8; double b = 1.57; a 12 * Math.Sin(b) / 10 3. 1. 2. a 12 * Math.Sin(1.57) / 10 a 12 * 1 / 10 a 12 / 10 a 1.2 8 1.2 6.8
Kifejezés típusa A kifejezésben található operandusok típusa közül a legbővebb Típusok viszonya: valós bővebb, mint az egész nagyobb helyfoglalású típus bővebb, mint a kisebb helyfoglalású byte + sbyte = int short + ushort = int int + uint = long long + ulong = x decimal + float = x decimal + double = x
Operátorok (aritmetikai) Operátor Kifejezés Precedencia Jelentés ++ x++ 1 Postinkrementálás -- x-- 1 Postdekrementálás ++ ++x 2 Preinkrementálás -- --x 2 Predekrementálás + +x 2 Pozitív előjel - -x 2 Negatív előjel * x * y 3 Szorzás / x / y 3 Osztás % x % y 3 Maradékképzés + x + y 4 Összeadás - x y 4 Kivonás
Inkrementáló / dekrementáló operátorok Változók értékének eggyel növelése (++), illetve eggyel csökkentése (--) Operandusuk csak változó (vagy tulajdonság, vagy indexelő) lehet Változataik: Prefix: ++x, --x A művelet eredménye x növelt (csökkentett) értéke Postfix: x++, x-- A művelet eredménye x növelés (csökkentés) előtti értéke Mindkét változat esetén x változó tartalma eggyel nő (csökken)
Inkrementáló / dekrementáló operátorok példa kifejezés (prefix) a kifejezés (postfix) a ++a + 7 + a 3 ++a + 7 + a 4 4 + 7 + a 4 11 + a 4 11 + 4 4 15 4 a++ + 7 + a 3 3 + 7 + a 3 3 + 7 + a 4 10 + a 4 10 + 4 4 14 4
Inkrementáló / dekrementáló operátorok (mi a kifejezés eredménye?) int a = 3; int b = ++a + 7; int a = 3; int b = a++ + ++a; int a = 3; int b = a++ + 7; int a = 3; int b = ++a + a++; int a = 3; int b = 2; int b = ++b * 12 + b * (a++ / 3) a
Operátorok (relációs) Operátor Kifejezés Precedencia Jelentés < x < y 6 Kisebb > x > y 6 Nagyobb <= x <= y 6 Kisebb egyenlő >= x >= y 6 Nagyobb egyenlő == x == y 7 Egyenlő!= x!= y 7 Nem egyenlő Eredményük logikai típusú
Operátorok (logikai) Operátor Kifejezés Precedencia Jelentés!!x 2 (logikai NEM) && x && y 11 (rk. * logikai ÉS) x y 12 (rk. * logikai VAGY) x y x x y x y F F T F F F T T F T T F F F T T T F T T * Rövidzár-kiértékeléses: ha az első operandusból egyértelműen kiderül a végeredmény, a második operandussal nem foglalkozik
Rövidzár-kiértékelés Ha az első operandusból egyértelműen kiderül a végeredmény, a második operandussal nem foglalkozik ÉS operátornál ha az első operandus hamis, a másodikkal nem érdemes foglalkozni, az eredmény mindenképp hamis lesz VAGY operátornál ha az első operandus igaz, a másodikkal nem érdemes foglalkozni, az eredmény mindenképp igaz lesz x y x y x y F F F F F T F T T F F T T T T T
Rövidzár-kiértékelés (melyik kód okoz futási hibát?) int i = 0; if(i!= 8 & 2 / i == 0) Console.WriteLine(i); int i = 0; if(i!= 8 && 2 / i == 0) Console.WriteLine(i); int[] t = {2, 4, 6, 8}; for(int i=0; i<4 & t[i]>0; ++i) Console.WriteLine(t[i]); int[] t = {2, 4, 6, 8}; for(int i=0; i<4 && t[i]>0; ++i) Console.WriteLine(t[i]); int[] t = {2, 4, 6, 8}; for(int i=0; t[i]>0 & i<4; ++i) Console.WriteLine(t[i]); int[] t = {2, 4, 6, 8}; for(int i=0; t[i]>0 && i<4; ++i) Console.WriteLine(t[i]);
Operátorok (bitenkénti) Operátor Kifejezés Precedencia Jelentés ~ ~x 2 (bitenkénti NEM) << x << y 5 Eltolás balra y helyiértékkel >> x >> y 5 Eltolás jobbra y helyiértékkel & x & y 8 (bitenkénti ÉS, nrk. * logikai ÉS) ^ x ^ y 9 (bitenkénti KIZÁRÓ VAGY) x y 10 (bitenkénti VAGY, nrk. * logikai VAGY) x y x x y x y x y 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 * Nem rövidzár-kiértékeléses
Eltolás (shift) operátorok Eltolás balra: x << y ( x * 2 y ) 4. 3. 2. 1. 0. 4. 3. 2. 1. 0. 0 1 0 1 0 0 1 0 1 0 0 10 20 Eltolás jobbra: x >> y ( x / 2 y ) 4. 3. 2. 1. 0. 4. 3. 2. 1. 0. 0 0 1 0 1 0 0 0 1 0 1 10 5
Operátorok (értékadó) Operátor Kifejezés Precedencia Jelentés = x = y 14 Értékadás += x += y 14 x = x + y -= x -= y 14 x = x y *= x *= y 14 x = x * y /= x /= y 14 x = x / y %= x %= y 14 x = x % y &= x &= y 14 x = x & y ^= x ^= y 14 x = x ^ y = x = y 14 x = x y <<= x <<= y 14 x = x << y >>= x >>= y 14 x = x >> y