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 + short + int + long + decimal + decimal +
sbyte ushort uint ulong float double
= = = = = =
int int long x x 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
3
++a + 7 + a
4
3+7+a
3
4+7+a
4
3+7+a
4
11 + a
4
10 + a
4
11 + 4
4
10 + 4
4
15
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
<
x
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ú
Jelentés
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
xy
xy
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
xy
xy
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
xy
xy
xy
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 * 2y ) 4.
3.
2.
1.
0.
0
1
0
1
0
0
4.
3.
2.
1.
0.
1
0
1
0
0
10 Eltolás jobbra: x >> y ( x / 2y) 0
20
4.
3.
2.
1.
0.
4.
3.
2.
1.
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