Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


TIPURI DE DATE PRIMITIVE (SCALARE }I void)

c



+ Font mai mare | - Font mai mic



TIPURI DE DATE PRIMITIVE (SCALARE }I void



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 constanta intreaga poate fi specificata in zecimal, octal sau hexazecimal si poate avea unul dintre tipurile: int sau long si signed sau unsigned. Ea are tipul int daca valoarea sa incape intr-un int, altfel are tipul long int. Este de asemenea posibil sa se specifice explicit ca o constanta are tipul long int prin adaugarea unui l sau L la sfa`rsitul sau. Constantele unsigned sunt terminate in u sau U, iar un sufix de forma ul sau UL indica o constanta de tipul unsigned long. O constanta ce incepe cu se considera in octal si o constanta ce incepe cu 0x sau 0X se considera in hexazecimal. Altfel se considera in zecimal.

O constanta caracter reprezinta un intreg egal cu codul caracterului in setul de caractere al masinii. O astfel de constanta se reprezinta printr-un caracter inclus intre apostroafe, spre exemplu 'a'. Anumite caractere speciale se reprezinta printr-o secventa de caractere ce incepe cu t, inclusa intre apostroafe, cum este spre exemplu 'tn'. O astfel de secventa se numeste secventa de control.

 

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 constanta 234.51), un exponent (spre exemplu constanta 2.e-3), sau ambele. Tipul unei constante reale este double Daca insa exista sufixul f sau F tipul este float, iar pentru sufixul l sau L, tipul este long double

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1249
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved