Programozás 3. Dr. Iványi Péter 1
Egy operandus művelet operandus operandus művelet Operátorok 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
Kiértékelési sorrend Fentről lefelé: Precedencia 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) Értékadás: = Egyenlőség: = =!!!!! FONTOS!!!!! 6
ÉS: VAGY: NEM:! Logikai műveletek && 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 < < 5 (-5 < ) && ( < 5) 7
Értékadás másképpen y = y + 1 y += 1 y = y 1 y -= 1 y = y * 1 y *= 1 y = y / 1 y /= 1 y = y % 1 y %= 1 y = y * ( + 1) y *= +1 8
Növelő és csökkentő operátorok Növelő: ++ Csökkentő: -- Lehet prefi vagy postfi!!! ++ egyenértékű =+1 ++ egyenértékű =+1 9
Növelő és csökkentő operátorok = 33; y = ++; y = ; = + 1; /* y = 33 = 34 */ = 33; y = ++; = + 1; y = ; /* y = 34 = 34 */ 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 akkor1, ha mindkét operandus ugyanazon bitpozíciójában elhelyezkedő bitek értéke egyaránt1. Minden más esetben az eredmény 0. Példa = 2 0000 0010 y = 40 0010 1000 & y = 0000 0000 = 0 Fontos, hogyez más && y = 1 (igaz) 12
bitenkénti VAGY Példa = 2 0000 0010 y = 40 0010 1000 y = 0010 1010 = 44 13
bitenkénti KIZÁRÓ VAGY Példa = 12 0000 1010 y = 40 0010 1000 ^ y = 0010 0010 = 34 14
További bitműveletek Balra tolás = 6 0000 0110 << 3 = 0011 0000 = 48 Jobbratolás = 48 0011 0000 >> 3 = 0000 0110 = 6 Komplemens = 6 0000 0110 ~ = 1111 1001 = 249 15
Operátor () [] ->.! ~ ++ -- + - * & (típus) sizeof * / % + - << >> < <= > >= ==!= & ^ &&?: = += -= *= /= %= &= ^= = <<= >>=, Asszociativitás balról jobbra jobbról balra balról jobbra balról jobbra 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(( & 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 j k művelet i j k 3 1 2 k = i+++j k = i++ + j 4 1 4 3 1 2 k = ++i+j++ k = ++i + j++ 4 2 5 3 1 2 k = -i+++j k = (-i)++ + j 4 1-2 3 1 2 k += -i+++j k += (-i)++ + j 4 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
24 Matematikai műveletek #include <math.h> y y arctan ), atan2( arctan ) atan( arcsin ) asin( arccos ) acos( tan ) tan( sin ) sin( cos ) cos( C Matematika e y y log 10 ) log10( ln ) log( ) ep( ) sqrt( ), pow( C Matematika
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 (eplicit) 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 1. long double long double 2. double double 3. float float 4. unsigned long int unsigned long int 5. 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 31
Értékadás Az értékadás szintén típuskonverzióval jár : a jobboldal értéke átalakula baloldal típusának megfelelően!!! Példa: int a; a = sqrt(25.0); 5 implicit double-int konverzió 32
Eplicit 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élda1. char ch; int i, r; float f; double d; r = (i / ch) + (f * d) (f + i); int double float int double double float double double int double 34
Példa2. char ch; int i, r; float f; double d; r = (i / ch) + (int)(f * d) ((int)f + i); double int int double 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