Programozás 3. Dr. Iványi Péter
1
Operátorok • Egy operandus művelet operandus operandus művelet
• Két operandus operandus1 művelet operandus2
2
Aritmetikai műveletek • • • • •
+ : összeadás - : kivonás * : szorzás / : osztás % : maradék osztás (csak egészekre)
• Egész osztás eredménye egész szám!!!
3
Példa • • • •
5/3=1 5 / 3.0 = 1.66666666666666667 5%3=2 14 % 3 = 2
4
Precedencia • Kiértékelési sorrend • Fentről lefelé: – Előjel (-) – Szorzás, osztás, maradék osztás (*, /, %) – Összeadás, kivonás (+, -)
• Balról-jobbra – 4/2*2 = 4 és nem 1
• Zárójellel módosítható a kiértékelési sorrend 5
Relációs műveletek • • • •
> >= < <= Egyenlő: == Nem egyenlő: != Relációs művelete eredménye: igaz (1), hamis (0) !!!!! FONTOS !!!!! Értékadás: = Egyenlőség: == 6
Logikai műveletek • • • •
ÉS: && VAGY: || NEM: ! Kiértékelés balról jobbra történik, és amint a kifejezés igaz vagy hamis értéke meghatározható a kiértékelés megáll. • Példa: -5 < x < 5 (-5 < x) && (x < 5)
7
Értékadás másképpen y y y y y
= = = = =
y y y y y
+ – * / %
1 1 1 1 1
y = y * (x + 1)
y y y y y
+= -= *= /= %=
1 1 1 1 1
y *= x+1
8
Növelő és csökkentő operátorok • Növelő: ++ • Csökkentő: -• Lehet prefix vagy postfix!!!
++x x++
egyenértékű egyenértékű
x=x+1 x=x+1
9
Növelő és csökkentő operátorok x = 33; y = x++; /* y = 33 x = 34 */
y = x; x = x + 1;
x = 33; y = ++x; /* y = 34 x = 34 */
x = x + 1; y = x;
10
Bitenkénti logikai operátorok • • • • • • •
& : bitenkénti ÉS | : bitenkénti VAGY ^ : bitenkénti KIZÁRÓ VAGY << : bitléptetés balra >> : bitléptetés jobbra ~ : egyes komplemens Csak egész számokra alkalmazható
11
bitenkénti ÉS • A művelet eredménye csak akkor 1, ha mindkét operandus ugyanazon bitpozíciójában elhelyezkedő bitek értéke egyaránt 1. Minden más esetben az eredmény 0. • Példa x = 2 y = 40 x & y = Fontos, hogy ez más x && y =
0000 0010 0010 1000 0000 0000
=
0
1 (igaz) 12
bitenkénti VAGY • Példa x = 2 y = 40 x | y
=
0000 0010 0010 1000 0010 1010
=
44
13
bitenkénti KIZÁRÓ VAGY • Példa x = 12 y = 40 x ^ y
=
0000 1010 0010 1000 0010 0010
=
34
14
További bitműveletek • Balra tolás x = 6 x << 3
=
0000 0110 0011 0000
=
48
=
0011 0000 0000 0110
=
6
=
0000 0110 1111 1001
=
249
• Jobbra tolás x = 48 x >> 3
• Komplemens x = 6 ~x
15
Operátor ()
[] ->
!
~
*
/
+
==
.
++ --
balról jobbra +
-
*
&
(típus) sizeof
%
jobbról balra balról jobbra
-
balról jobbra
<< <
Asszociativitás
>> <=
>
balról jobbra >=
!=
balról jobbra balról jobbra
&
balról jobbra
^
balról jobbra
|
balról jobbra
&&
balról jobbra
||
balról jobbra
?:
jobbról balra
= += -= *= /= %= &= ^= |= <<= >>=
jobbról balra
,
balról jobbra 16
Precedencia • A táblázat sorai azonos precedenciával bírnak. • Asszociativitás: azonos precedenciájú operátorokat tartalmazó kifejezésben a kiértékelés iránya • Példa: a & b || c a = b || c
(a & b) || c a = (b || c)
17
Precedencia • Mivel a bitműveletek precedenciája kisebb mint az egyenlőségi vizsgálaté ezért a bitműveleteknél zárójelezni kell if((x & mask) == 0) ...
18
Asszociativitás Csoportosíthatóság, táblázat szerint Példa: int a, b, c; a = b = c = 26;
Zárójelezve: a = (b = (c = 26))
19
Mellékhatás • Bizonyos műveletek feldolgozása során a kifejezés értékének megjelenése mellett változók is megváltozhatnak. Ez a mellékhatás. • A mellékhatások kiértékelésének sorrendjét nem határozza meg a C nyelv – Kivéve: &&
||
?:
,
20
Mellékhatás példa printf(”%d %lf\n”, ++n, power(2, n)) Eredmény: implementációtól függ Megoldás: Ha valami miatt fontos a kiértékelési sorrend, akkor a közbenső eredményeket segédváltozókban kell tárolni, szét kell szedni vagy zárójelezni kell. ++n printf(”%d %lf\n”, n, power(2, n)) 21
Speciális példák i 3 3 3 3
j 1 1 1 1
k 2 2 2 2
művelet k = i+++j
k = i++ + j
k = ++i+j++
k = ++i + j++
k = -i+++j
k = (-i)++ + j
k += -i+++j
k += (-i)++ + j
i 4 4 4 4
j k 1 4 2 5 1 -2 1 0
22
A ? operátor, még egyszer if(a>b) z = a; else z = b;
Közvetlen átírás rossz: a>b ? z=a : z=b;
mivel precedencia figyelembe vételével ezt kapjuk: (a>b ? z=a : z) = b;
Helyesen: z = (a>b) ? a : b;
vagy a>b ? (z=a) : (z=b); 23
Matematikai műveletek #include <math.h> C
Matematika
cos( x ) sin( x) tan( x)
cos x sin x tan x
acos( x) asin ( x ) atan ( x)
arccos x arcsin x arctan x y arctan x
atan2( x, y )
C
pow ( x, y )
Matematika
xy
sqrt ( x)
x
exp( x) log( x)
ex ln x
log10( x)
log10 x
24
Adattípusok
25
Adattípusok Definíció char int float double
Byte 1 2 4 8
Értelmezés Karakter Egész szám Valós szám, egyszeres pontosság Valós szám, kétszeres pontosság
26
Típuskonverzió • Előfordulhat, hogy az operandusok különböző típusúak • A művelet elvégzéséhez azonos típusúra kell az operandusokat alakítani – Automatikus (implicit) – Programozó által előírt (explicit)
27
Alapszabály • Ha az operandusok különböző típusúak, akkor a „szűkebb” típusú operandus alakul át a „szélesebb” típusúvá (információ vesztés nélkül), a műveletek elvégzése előtt. Az eredmény „szélesebb” típusú lesz.
28
Példa implicit konverzióra int i = 5, j; float f = 3.65, g; g = i + f;
/* i átalakul float-ra g értéke 8.65 lesz */
j = i + f;
/* i átalakul float-ra de j értéke 8, információvesztés */ 29
Konverziók • Lebegőpontos à egész konverzió – Tört rész elhagyása – Ha az egész szám nem tudja reprezentálni az egész részt, akkor az eredmény határozatlan
• Egész típusok konverziója – char, short int à int – Ha int nem elég akkor unsigned int – Egész típus mindig konvertálható lebegőpontossá
30
Aritmetikai konverziók •
Ha valamelyik operandus long double à long double double à double float à float unsigned long int à unsigned long int long int és a másik unsigned int akkor vagy long int ha képes tárolni a számot, vagy unsigned long int 6. long int à long int 7. unsigned int à unsigned int 8. Ha egyik fenti szabály sem, akkor int 1. 2. 3. 4. 5.
31
Értékadás • Az értékadás szintén típuskonverzióval jár : a jobboldal értéke átalakul a baloldal típusának megfelelően!!! • Példa: int a; a = sqrt(25.0);
5
implicit double-int konverzió 32
Explicit típuskonverzió (casting) (típus)kifejezés
• A kifejezés eredménye a megadott típusúra konvertálódik a szabályok alapján. • Példa: int a; a = (int)(1.2 * 6);
7
33
Példa 1. char ch;
int i, r;
float f;
double d;
r = (i / ch) + (f * d) – (f + i); double
int int
float
double
float
double double int
double double 34
Példa 2. char ch;
int i, r;
float f;
double d;
r = (i / ch) + (int)(f * d) – ((int)f + i); double
int
double
int
int int
int int
int
int 35
Konstansok definiálása • A program fejlécében: #define
pi
3.1415
• A programon belül a konstans helyett a név használható:
36
Példa #include <stdio.h> #define pi 3.1415 main() { double sugar, terulet; printf(”sugar=”); scanf(”%lf”, &sugar); terulet = sugar * sugar * pi; }
37
Felsorolt típus • enum azonosító { felsorolás };
• Egy adattípus, melynek lehetséges értékeit a lista tartalmazza • A konstansok int-ek (egészek) lesznek • A fordító ellenőrzi, hogy egy változó az adott halmazból való-e
38
Példák enum valasz { igen, nem, talan}; enum valasz { igen, nem=10, talan};
39
Példa 1. enum napok { hetfo, kedd, szerda, csutortok, pentek, szombat, vasarnap }; enum napok mai_nap; mai_nap = vasarnap; if(mai_nap == vasarnap || mai_nap ==szombat) { /* unnep */ } else { /* munkanap */ } 40
Példa 2. enum torpek { tudor, vidor, hapci, kuka, morgo, szende, szundi }; enum torpek a; a = hetfo; /* FIGYELMEZTETES */ a = 26; /* FIGYELMEZTETES */
41
Elolvasni, megtanulni • Kernighan-Ritchie: A C programozási nyelv – 2. Fejezet
• Benkő Tiborné: Programozzunk C nyelven! – 3.3. – 3.4. Fejezetek, kivéve 3.3.5 alfejezet
42