CATEGORII DOCUMENTE |
Exista opt tipuri de intregi si trei tipuri de reali. Tipurile intregi sunt: int short int long int unsigned short int unsigned long int unsigned char signed char si tipul enumerare. Tipurile reale sunt: float double si long double
O
O
Figura 1.Ierarhia tipurilor de date ale limbajului C
Lista completa a secventelor de control este urmatoarea:
ta caracterul 'bell'
tb caracterul 'backspace'
tf caracterul 'formfeed'
tn caracterul 'newline'
tr caracterul 'carriage return'
tt caracterul 'tab' orizontal
tv caracterul 'tab' vertical
tt caracterul 'backslash'
t? caracterul semnul @ntrebarii
t' caracterul apostrof
t' caracterul ghilimea
tooo caracterul cu codul in octal ooo o reprezenta`nd o cifra octala
txhh caracterul cu codul in hexazecimal hh h reprezenta`nd o cifra hexa
Un tip enumerare este un tip unic ale carui valori apartin unei multimi de constante intregi cu nume numite enumeratori. Tipurile enumerare ofera o modalitate convenabila de a asocia nume simbolice unor constante intregi si se utilizeaza pentru a reprezenta obiectele unei probleme ce pot lua un numar mic de valori. Un exemplu de tip enumerare este:
enum logic ;
Primului enumerator i se asociaza valoarea 0, urmatorului valoarea 1, s.a.m.d., exceptand situatiile in care valoarea unui enumerator este indicata explicit. In acest caz, valorile enumeratorilor continua in progresie aritmetica pornind de la valoarea indicata explicit. Alte exemple de tipuri enumerare sunt:
enum caractere ;
enum luni ;
/* FEB este 2, MAR este */
Constantele reale contin un
punct zecimal (spre exemplu
Fiecare obiect are o adresa unica ce identifica locatia de memorie unica corespunzatoare obiectului. Obtinerea adresei unui obiect se face cu operatorul &. Instructiunea:
ptr = &j;
se citeste astfel: 'atribuie lui ptr adresa lui j '.
Functia standard scanf(), utilizata pentru efectuarea de operatii de intrare cu format, primeste ca argumente adresele elementelor citite, care se specifica de obicei cu ajutorul operatorului &, ca in exemplul urmator:
scanf('%d',&i);
Pentru stocarea adreselor este necesar un tip special de obiect numit pointer. Declararea unui pointer se face plasand un * inaintea numelui obiectului, ca in exemplul urmator:
int *ptr; /* ptr poate memora adresa unui
obiect de tip int */
Pointerii nu trebuie confundati cu intregii. Urmatorul program ilustreaza diferenta dintre un pointer si un intreg:
#include <stdio.h>
main()
Pentru afisarea valorii unui pointer cu functia printf() se foloseste descriptorul de format %p.
Operatia de determinare a valorii unui obiect a carui adresa este continuta intr-o variabila de tip pointer se numeste dereferentiere sau adresare indirecta, si se specifica cu operatorul *. Urmatorul program ilustreaza aceasta operatie:
#include <stdio.h>
main()
Limbajul C permite utilizarea mai multor tipuri aritmetice intr-o expresie, cu respectarea ca`torva restrictii. In acest scop, limbajul C efectueaza automat anumite conversii, numite conversii implicite. Acest lucru poate fi periculos in anumite situatii, deoarece poate produce anumite rezultate neasteptate. Spre exemplu, expresia:
3.0 + 1/2
nu se evalueaza la 3.5, ci la 3.0.
Conversiile implicite apar in urmatoarele patru situatii:
in instructiunile de atribuire, valoarea din partea dreapta a atribuirii se converteste la tipul variabilei din partea stanga a atribuirii. Aceste conversii se numesc conversii de atribuire;
ori de cate ori un char sau un short int apare intr-o expresie, el este convertit la un int. Un unsigned char sau un unsigned short sunt convertite la un int numai daca 'incap' intr-un int, altfel sunt convertite la un unsigned int. Aceste conversii se numesc conversii de largire (marire) a @ntregilor;
in expresiile aritmetice, obiectele sunt convertite conform regulilor de conversie a operatorilor;
in anumite situatii, parametrii transmisi functiilor se convertesc conform anumitor reguli.
Pentru a intelege al treilea tip de conversii, trebuie inta`i sa descriem pe scurt modul in care compilatorul de C prelucreaza expresiile. O expresie consta dintr-un operator si unul sau mai multi operanzi. Spre exemplu, expresia:
-3/4 + 2.5
se descompune dupa cum este ilustrat grafic in figura 2.
Operatorul + se aplica subexpresiilor -3/4 si 2.5. Operatorul / se aplica subexpresiilor -3 si 4. Operatorul unar - se aplica subexpresiei 3. Cand subexpresiile se reduc la constante sau variabile, procesul de impartire in subexpresii se @ncheie. Fiecare operator necesita ca operanzii sai sa respecte anumite reguli. Majoritatea operatorilor binari cer ca operanzii sa aiba acelasi tip. In cazul in care tipurile nu coincid, unul dintre operanzi se converteste astfel incat conditia de potrivire a tipurilor sa fie satisfacuta. Pentru a decide care operand trebuie convertit, compilatorul are in vedere o ierarhie a tipurilor aritmetice in functie de 'marimea' acestora, convertind tipul 'mai mic' la tipul 'mai mare'.
long double > double > float > unsigned long int > long int > unsigned > int
Figura 2.Descompunerea expresiei -3/4 + 2.5
Regulile pentru conversiile implicite din cadrul expresiilor sunt:
daca o pereche de operanzi contine un long double, cealalta valoare este convertita la long double
altfel, daca un operand e double, celalalt se converteste la double
altfel, daca un operand e float, celalalt se converteste la float
altfel, daca un operand e unsigned long, celalalt se converteste la unsigned long
altfel, daca un operand e long int, celalalt se converteste la long int
altfel, daca un operand e unsigned int, celalalt se converteste la unsigned int
Facem observatia ca aceste conversii au loc dupa efectuarea tuturor conversiilor de largire a intregilor.
Este de asemenea posibil sa se converteasca explicit o valoare la un anumit tip, printr-o operatie numita conversie de tip Constructia sintactica asociata acestei operatii se numeste cast (de la 'casting' din engleza). Un cast consta in plasarea numelui tipului in care se doreste convertita expresia, inclus intre paranteze rotunde, exact inaintea expresiei. Spre exemplu:
j = (float) 2;
converteste intregul 2 la un float, inainte de a-l atribui lui j. Daca j este un tip aritmetic diferit de float, va avea loc o conversie de atribuire la tipul lui j.
Tipul de date void are doua utilizari majore. Prima utilizare se refera la indicarea faptului ca o functie nu returneaza nici o valoare, adica, in termenii limbajului Pascal, corespunde unei proceduri.
Spre exemplu:
void functie()
A doua utilizare se refera la declararea pointerilor generici. Un pointer generic este automat convertit la tipul corect ca`nd i se atribuie o adresa. Un pointer generic se declara astfel:
void *p;
Pointerii generici se utilizeaza la alocarea dinamica a memoriei.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1365
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved