190 likes | 347 Views
Programozás alapjai GEIAL 3 12 B (ANSI C) BSc (Bachelor of Science) / Alap képzés 200 5 /200 6 . őszi f élév Miskolci Egyetem Általános Informatikai Tanszék. Témák:. Operátorok Kiértékelés Konverzió. prec1. Elsődleges operátorok. () kifejezés kiértékelési sorrendjének előírása
E N D
Programozás alapjai GEIAL312B(ANSI C)BSc (Bachelor of Science) / Alap képzés2005/2006. őszi félévMiskolci Egyetem Általános Informatikai Tanszék
Témák: • Operátorok • Kiértékelés • Konverzió
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
prec2. Egyoperandusú operátorok 1. (tipus) cast, kikényszerített típus konverzió (double) k sizeof vá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)
prec2. Egyoperandusú operátorok 2. + előjel (a szimmetria kedvéért) - előjel a = 4 - - x; a = 4 - (-x); ++ növelés 1 egységgel, előtagos, utótagos ++i j++ -- csökkentés 1 egységgel ~ bitenkénti komplemens ! logikai tagadás (relációs, logikai kifejezés: 0 ha hamis, 1 ha igaz)
prec3. Multiplikatív operátorok * szorzás / osztás 5/2 2 -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)
prec4. Additív operátorok + összeadás - kivonás
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)
prec6. Relációs operátorok > >= < <= Az eredmény int típusú: 0 ha hamis 1 ha igaz i < 5*j i < (5*j) (a zárójel felesleges) Megj.: aritmetikai kifejezés ha 0, akkor hamis, különben igaz
prec7. Egyenlőség operátorok == egyenlő (gyakori hiba!) != nem egyenlő
prec8-10. Bitenkénti műveletek & bitenkénti ÉS (AND) n=n & 0177 (az utolsó 7 bit kivételével nulláz) 0177=127=0000000001111111 ^ bitenkénti kizáró VAGY (XOR) 1 ha különböznek a bitek 0 ha megegyeznek a bitek | bitenkénti VAGY (OR) n=n|010 (jobbról a negyedik bit 1 lesz)
prec11-12. 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 ...001 y …010 x&&y értéke 1 (igaz) Megj.: a kiértékelés félbeszakad, ha megvan az eredmény!
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
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;
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.
Egyoperandusú operátorok mellékhatásai Pl. i=0; a=b[i++]; /* a=b[0] és i=1 */ vagy i=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 )
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); vagy printf("%d%d\n",++n,negyzet(n)); vagy a[i]=i++; A sorrendet a fordítóprogram dönti el (optimalizálás). Megoldás: segédváltozó alkalmazása.
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.
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);