Típusok és konstansok Programozás I. Hatwágner F. Miklós Széchenyi István Egyetem, Gy®r
2013. október 3.
Szimbólumok Forráskód részei: szimbólumok (szintaktikai egységek, tokenek) fehér karakterek (összevonás, gyelmen kívül hagyás) Szimbólumok: operátor kulcsszó for, while, int, oat, . . . nem szabványos kulcsszavak, védett azonosítók (pl. cdecl, stdcall, _ és __ jellel kezd®d®k) elválasztó jel azonosító konstans karakterlánc Hatwágner F. Miklós
Típusok és konstansok
Azonosítók Változók, függvények, felhasználói adattípusok nevei. Els® karakter: kis- vagy nagybet¶, ill. _ További karakterek: u. a., és számjegyek Nem lehet kulcsszó vagy védett azonosító Kis- és nagybet¶re érzékenyek Ajánlás: ne kezd®djön egy vagy két _ karakterrel Szignikáns karakterek száma OK meno_mano Meno_Mano sokReszbolOsszeteve
Mi lehet a gond? Gipsz Jakab 66_os_ut Men®_Manó auto Hatwágner F. Miklós
Típusok és konstansok
Típusok Típuskategóriák: függvény (csak ez eredményez kódot) void (hiány jelzése) skalár egész típusok lebeg®pontos típusok felsorolás (enum) mutatók aggregátum tömb struktúra (struct) únió (union)
Hatwágner F. Miklós
Típusok és konstansok
Típusok Csoportosítás alapja lehet: alaptípusok (void, char, int, float, double) származtatott típusok, típusmódosítókkal short / long (csak egészekhez, nincs aé.) signed (aé.) / unsigned Deklaráció: objektum ↔ azonosító típus meghatározása memóriafoglalás? Példák deklarációkra
típus típus
típus típusú objektumok */ típus típussal visszatér® függvény */ void fv2(típus t); /* típus típusú paramétert fogadó függvény */ /* típus típussal visszatér®, és ilyen típusú paramétert fogadó függvény típus fv3(típus t); típus tomb[5]; /* 5 elem¶, típus típusú elemekb®l álló tömb */ t1, t2; /*
fv1(void); /*
Hatwágner F. Miklós
Típusok és konstansok
*/
Típusmódosítók További két típusmódosító (min®sít®) const azonosító nem szerepelhet balértékként (csak olvasható változó) bármilyen típussal együtt használható kötelez® inicializálni volatile változó értéke prg. végrehajtáson kívüli okból módosulhat (pl. párhuzamos programszál, megszakítás, stb.) Akár egyszerre is használhatóak! Példa a const min®sít® használatára const double e = 2.71828; const eletErtelme = 42; /* const signed int */
Hatwágner F. Miklós
Nem módosítható! e = 1234; ++eletErtelme;
Típusok és konstansok
Egész típusok, konstansok Korábban megismert tulajdonságokon túlmen®en. . .
char alaptípus: biztosan 1 bájtos de a karakter konstans típusa int → pl. 'xxxx', el®jel kiterjesztés alapértelmezetten signed, de átállítható egész típusok ábrázolási korlátai → limits.h nincs alul- és túlcsordulás limits.h részletek # dene SCHAR_MIN (-128) # dene UCHAR_MAX 255 # dene SHRT_MAX 32767 # dene INT_MAX 2147483647 # dene ULONG_MAX 18446744073709551615UL Hatwágner F. Miklós
Típusok és konstansok
Egész típusok, konstansok Egész konstansok tulajdonságai: megadható decimális, oktális (0. . . ) és hexadecimális (0x. . . , 0X. . . ) alakban (a. . . f, A. . . F) nincs el®jele → egyoperandusos − bels® ábrázolás int, de megváltoztatható decimális: int, long int, unsigned long int oktális, hexadecimális: int, unsigned int, long int, unsigned long int utótagok, konverzió elkerülésére: u, U (unsigned) l, L (long) Egész típusú változók és konstansok
int i = 1; int j = 010; /* == 8 */ int k = 0x2A; /* == 42 */
unsigned ui = 8u; long li = 16L; unsigned long uli = 666Ul;
Hatwágner F. Miklós
Típusok és konstansok
Felsorolt típus egész értékek sorozatának mnemonikussá tétele (ld. még #dene, const) enum <enum-címke><{enumerátorlista}>
;
enum ekocsi {opel, vw, toyota, honda, renault, citroen} kocsi; Az
tulajdonságai: típus neve: enum ekocsi → enum, struct és union által közösen használt névterületén egyedinek kell lennie!
enum-címke
Névterület Azonosító csoport, amelyen belül az azonosítóknak egyedieknek kell lenniük.
Hatwágner F. Miklós
Típusok és konstansok
Felsorolt típus
tulajdonságai: elemei: enumerátorok, enum konstansok normál változók névterületét használják típusuk mindig int értéküket elhagyható konstans kifejezések deniálják értékek 0-tól vagy az utoljára deniált értékt®l implicit módon 1-esével n®nek
enumerátorlista
enum ekocsi {opel, vw, toyota=10, honda, renault=2*toyota, citroen} kocsi; /* opel == 0, vw == 1, toyota == 10, honda == 11, ... */
Hatwágner F. Miklós
Típusok és konstansok
Felsorolt típus Példák
enum nemet {opel, vw=10} deutscheKraft; enum nemet szomszedKocsija; /* Kés®bb nem lehet több ilyen típusú változót létrehozni */ enum {toyota, honda} rizsRaketa; enum {renault, peugeot}; int kocsi; /* int vw; HIBA: azonos névterületen már létezik ilyen azonosító */ int nemet; /* OK */ int it[3]; { /* OK: ebben a hatókörben nincs ilyen nev¶ azonosító */ int vw; } deutscheKraft = opel; deutscheKraft = renault; /* Pimasz, de OK :) */ szomszedKocsija = 2; /* OK, de nem javasolt */ szomszedKocsija = (enum nemet)2; kocsi = honda; kocsi = peugeot; it[toyota] = vw; /* toyota++; HIBA: enum konstans nem lehet balérték */ Hatwágner F. Miklós
Típusok és konstansok
Valós típusok, konstansok Típus
Méret
Számábrázolási határok
Pontosság
oat double long double
4 bájt 8 bájt 10 bájt
±3, 4 · 10−38 ±3, 4 · 10+38 ±1, 7 · 10−308 ±1, 7 · 10+308 ±1, 2 · 10−4932 ±1, 2 · 10+4932
6-7 dec. jegy 15-16 dec. jegy 19 dec. jegy
Konstansok tulajdonságai: ábrázolási határok → oat.h mantisszából elhagyható az egész- vagy a törtrész, de mindkett® nem! elhagyható a tizedes pont vagy az exponens (e, E) rész, de mindkett® nem! nincs el®jele → egyoperandusos − utótag nélkül a bels® ábrázolás double f, F (float) l, L (long double, formátumspecikáció: %Lf) Néhány lebeg®pontos konstans -5., .3, 5.3, -5e4, 5.67E-12, -1.23e-4l, 5.F Hatwágner F. Miklós
Típusok és konstansok
Karakterláncok kezelése Karakterlánc konstansok (string literal), kiegészítés: elhelyezés: statikus adatterületen a fehér karakterrel elválasztott karakterlánc konstansokat a fordító egyesíti több sorba is írható, ha \-sel zárjuk a sort (folytatássor) Karakterlánc konstansok printf("Régi " "nóta " "másképp: \n"); printf("Hosszú az a nap, \ ami programozás nélkül múlik el\n"); Kimenet Régi nóta másképp: Hosszú az a nap, ami programozás nélkül múlik el Hatwágner F. Miklós
Típusok és konstansok
Karakterláncok kezelése A függvény visszaadja s karakterlánc méretét → strlen() int length(char s[]) { int i = 0; while(s[i] != '\0') ++i; /* int i; for(i=0; s[i]; i++); */ return i; } karakterlánc int-té alakítása és visszaadása → atoi() int atoi(char s[]) { int i, n=0; for(i=0; s[i]>='0' && s[i]<='9'; ++i) n=10*n+s[i]-'0'; return n; } s
Hatwágner F. Miklós
Típusok és konstansok
Karakterláncok kezelése Ha a c paraméter nagybet¶, akkor kisbet¶ssé konvertálva, egyébként változatlanul adja vissza → tolower() int lower(int c) { if(c>='A' && c<='Z') return(c-'A'+'a'); else return c; } karakter minden el®fordulásának törlése az void squeeze(char s[], int c) { int i, j; for(i=j=0; s[i]!='\0'; i++) if(s[i] != c) s[j++] = s[i]; s[j] = '\0'; } c
Hatwágner F. Miklós
s
karakterláncból
Típusok és konstansok
Deklaráció Deníciós deklaráció (deníció) Helyfoglalás az objektumnak, esetleg kezd®értékadás. Hatókörön belül csak egy ilyen létezhet. Referencia deklaráció (deklaráció) Nincs helyfoglalás, de tudatja a fordítóval az azonosítót, adattípust, stb. Több is létezhet ugyanarra az objektumra. Kísérleti deníció Minden küls® adatdeklaráció, melynek nincs tárolási osztály specikátora és explicit inicializátora. Ha kés®bb is felt¶nik, extern-nek kell tekinteni (≈ referencia deklaráció). Ha a fordítási egység végéig nem t¶nik fel, teljes denícióvá válik, tiszta zérus kezd®értékkel. Deklarációs pont A deklaráció helye, el®tte nem érhet® el az objektum. Hatwágner F. Miklós
Típusok és konstansok
Deklaráció Példák /* Minden blokkon kívül! */
int i; int i;
/* OK, nincs új infó. */
int j; int j=3; /* OK, nincs ellentmondás, most adtuk meg, mire kell inicializálni. */ int k=1; int k=2; /* HIBA, nem lehet többszörösen inicializálni. */
Hatwágner F. Miklós
Típusok és konstansok
Egyszer¶ típusdeníció (typedef) typedef: a tárolási osztály specikátor helyén szerepel új adattípus specikátor deniálására szöveghelyettesítésnél (#define) komplexebb feladatokra is alkalmas const és volatile alkalmazható rá, de más típusspecikátor nem! typedef használata #include <stdio.h> #define TIPUS long int int main(void) { auto long int li; typedef long int LI; /* unsigned LI j; HIBA */ LI egesz; const LI hosszuEgesz = 5l; /* OK */ TIPUS he = 3l; /* OK */ return 0; } Hatwágner F. Miklós
Típusok és konstansok