1 Programozás alapjai GEIAL312B (ANSI C) BSc (Bachelor of Science) / Alap képzés 2005/2006. őszi félév Miskolci Egyetem Általános Informatikai Tanszék
2 Témák: Operátorok Kiértékelés Konverzió
3 prec1. Elsődleges operátorok ()kifejezés kiértékelési sorrendjének előírása a * ( x + y ) []tömbelem hivatkozás a [ i + 2 ] ->struktúra mező hivatkozás struktúrára mutató pointerrel hallg_strukt_mut -> nev.struktúra mező hivatkozás hallgato. nev
4 prec2. Egyoperandusú operátorok 1. (tipus)cast, kikényszerített típus konverzió (double) k sizeofváltozó, típus memória mérete: byte sizeof(i)sizeof(int) &változó címe &y *visszahivatkozás egy adott címen tárolt aktuális értékre *(&y)
5 prec2. Egyoperandusú operátorok 2. +előjel (a szimmetria kedvéért) -előjel a = x;a = 4 - (-x); ++növelés 1 egységgel, előtagos, utótagos ++ij++ --csökkentés 1 egységgel ~bitenkénti komplemens !logikai tagadás (relációs, logikai kifejezés: 0 ha hamis, 1 ha igaz)
6 prec3. Multiplikatív operátorok *szorzás /osztás 5/22 -5/2-2 vagy -3 (fordítótól függ) megoldás: (float) 5/-2 %modulo (maradékos osztás, csak int típusra) -5%2 -1 vagy 1 (gépfüggő) megoldás: abs(-5%2)
7 prec4. Additív operátorok +összeadás -kivonás
8 prec5. Eltolás, léptetés <<balra tolás, üres helyet 0-val tölt x<<2(szorzás néggyel) >>jobbra tolás, üres helyet unsigned: 0-val signed: 1-gyel vagy 0-val tölt y>>3(osztás 8-cal)
9 prec6. Relációs operátorok >>=<<= Az eredmény int típusú: 0ha hamis 1ha igaz i < 5*j i < (5*j)(a zárójel felesleges) Megj.: aritmetikai kifejezés ha 0, akkor hamis, különben igaz
10 prec7. Egyenlőség operátorok ==egyenlő(gyakori hiba!) !=nem egyenlő
11 prec8-10. Bitenkénti műveletek &bitenkénti ÉS (AND) n=n & 0177(az utolsó 7 bit kivételével nulláz) 0177=127= ^bitenkénti kizáró VAGY (XOR) 1ha különböznek a bitek 0ha megegyeznek a bitek |bitenkénti VAGY (OR) n=n|010 (jobbról a negyedik bit 1 lesz)
12 prec Logikai ÉS, VAGY műveletek &&logikai ÉS (AND) ||logikai VAGY (OR) Pl.: ha x=1és y=2, akkor x & y értéke 0, mert x y …010 x&&y értéke 1 (igaz) Megj.: a kiértékelés félbeszakad, ha megvan az eredmény!
13 prec13. Feltételes kifejezés feltétel ? igaz_eset : hamis_eset (ternary, három operandusú művelet) Pl.a=(b<5) ? -5 : 12; ha b=1, akkor a=-5 ha b=8, akkor a=12
14 prec14. Értékadási műveletek változó (operátor) = kifejezés egyenértékű a változó = változó (operátor) kifejezés -sel Az operátor lehet: +, -, *, %, /, &, ^, |, > Előnye, hogy változó csak egyszer értékelődik ki. Pl. x*=y+1; ->x=x*(y+1); és nem x=x*y+1;
15 prec15. Kifejezés lista kif1, kif2, kif3,... Kiértékelés balról jobbra, értéke az utoljára kiértékelt kifejezés értéke.
16 Egyoperandusú operátorok mellékhatásai Pl.i=0; a=b[i++];/* a=b[0] és i=1 */ vagyi=0; a=b[++i];/* a=b[1] és i=1 */ Makróknál: #define min(a,b) (a<b ? a : b)... i=0; j=min(i++,5); /* j=(i++<5 ? i++ : 5) */ ( i=2 és j=1 lesz )
17 Kifejezések kiértékelési sorrendje Precedencia szabály az előbbiek szerint. A && || ?:, operátorok kivételével nem meghatározott az operandusok kiértékelési sorrendje. Pl. x=f(x)+g(y); vagyprintf("%d%d\n",++n,negyzet(n)); vagya[i]=i++; A sorrendet a fordítóprogram dönti el (optimalizálás). Megoldás: segédváltozó alkalmazása.
18 Kifejezések típus konverziója A különböző típusú operandusokat a művelet végrehajtása előtt közös típusra kell alakítani. Automatikus: keskenyebb -> szélesebb Pl. x+i x float, i egész esetén az i -> float A char és az int szabadon keveredhet: char -> int int -> char esetén túlcsordulás lehet. Pontos eljárás a K&R könyvben.
19 Konverzió értékadáskor A jobboldal a bal típusára konvertálódik. A karakter mindig egésszé. long -> int, short, char (magasabb bitek elvesznek) float -> int (törtrész elvész) double -> float (kerekít vagy levág!) Kényszerített típusmódosítás: Pl. int n; x=sqrt((double) n);