|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Declaratii in C | ||||||
|
||||||
x5i8iu O structura este un obiect constind dintr-o secventa de memorii cu nume. Fiecare membru poate avea orice tip. O reuniune este un obiect care, la un moment dat, poate contine pe oricare din mai multi membri. Specificatorii de structuri si reuniuni au aceeasi forma: struct-or-union-specifier: struct-or-unionAstruct-decl-listS struct-or-union identifierAstruct-decl-lisSI struct-or union identifier struct-or-union struct union lista struct-decl-list este o secventa de declarare pentru membrii structurii sau uniunii. struct-decl-list: struct-declaration struct-declaration struct-decl-list struct-declaration: type-specifier struct-declarator-list; struct-declarator-list: struct-declarator struct-declarator, struct-declarator-list in cazul uzual, un struct-declarator este numai un declarator pentru un membru al unei structuri sau uniuni. Un membru din structura poate consta dintr-un numar de biti. Un astfel de membru se numeste cimp (NT field) lungimea sa este despartita de numele cimpului prin 2 puncte: structt-declarator: declarator declarator:constant-exprression :constant-expression Intr-o structura obiectele declarate au adrese care cresc pe masura ce declararea lor se citeste de la stinga la dreapta. Fiecare membru al unei structuri (care nu e cimp) incepe la limite de adrese corespunzatoare tipului sau; dar pot fi gauri fara nume intr-o structtura. Mmebrii de tip cimmp sint impachetati in intregi (NT repreentare pe masina intregilor ) ei nu stradle cuvinte. Un cimp care nu incape intr-un cuvint de memorie se continua pe urmatorul. Un cimp nu trebuie sa depaseasca un cuvint (NT ca lungime ?) Cimpurile sint asigurate de la dreapta la stinga la PDP si de la stinga la dreapta pe alte masini. Un struct-declarator fara declarator continind doua puncte si o lungime indica un cimp fara nume folositor pentru conformate cu formatele externe, care se impun. Ca un caz special, un cimp cu lungime0 specifica eliminarea urmatorului cimp la granita de cuvint. "Urmatorul cimp " este un cimp si nu un membru ordinar al structurii pentru ca pentru acest caz alinierea se face automat. Limbajul nu face restrictie asupra tipurilor de lucruri care se declara ca si cimpuri, dar implementarile nu suporta decit cimpuri de tip intreg. Chiar si cimpurile int sint considerate ca fara semn. La PDP cimpurile nu au semn si au numai valori intregi. In toate implementarile nu exissta tablouri de cimpuri, astfel ca operatorul & nu se poate aplica, neexistind pointeri spre cimpuri. O uniune poate fi gindita ca o structura a caror membrii incep cu deplaasamentul 0 si de dimensiune suficienta pentru a contine pe oricare din membrii. La un mmoment dat doar un membru este stocat. Un specificator de structura sau uniune de forma a 2-a, adica struct identifierAstruct-decl-listtS union identifierAstruct-decl-listS declara identificatorul ca eticheta (marcaj) de structura (sau uniune) a structturii specificate de lista. O declaratie de a treia forma struct identifier union identifier Etichetele de structura permit definirea de structuri auto referibile ele permit ca partea lunga a unei structuri sa fie data odata si folosita de mai multe ori. Este ilegal a declara o structura sau uniune care face apel la ea insasi, dar o structura sau uniune poate contine un pointer la un apel spre ea insasi. Numele membrilor si etichetele sint la fel ca pentru variabilele ordinare dar sa fie distincte mutual. Doua structuri pot folosi in comun o secventa initiala de membri; adica acelasi membru apare in doua structuri diferite daca au acelasi tip in ambele si daca membrii anteriori sint acesasi in ambele(In momentul de fata, compilatorul verfica numai daca in unul din doua structuri diferite are acelasi tip si deplasament in ambele, dar daca membrii precedenti difera, constructtia este neportabila ). Exemplu simplu de declarare de structura: struct tnodeA char tworda20i; int count; struct tnode *left; struct tnode *right; Odata aceasta declaratie facuta, declaratia struct tnode s, *sp; declara S ca fiind o structura de tipul dat si sp un pointer la o structura de tipul dat. Cu aceste declaratii expresia: sp->count Se refera la cimpul count spre care pointeaza sp; s. left Se refera la pointerul subarborelui stinga s. right->tworda0i Se refera la primul caracter al subarborelui tword din arborelui drept al lui S. 8. 6. Initializare Un declarator poate specifica o valoare initiala pt identificatorul declarat. Initializatorul este precedat de = si consta dintr-o expresie sau o lista de valori in acolade. initializer: Toate expresiile pentru initializarea unei variabile statice sau externe trebuie sa fie expresii de constanta, descrise in &15, sau expresii care se reduc la adresa variabilei declarate anterior, cu posibilitatea de a fi deplasate printr-o constanta. Variabila automatic si register pot fi initializate cu expresii arbitrare care pot contine constante, variabile declarate anterior si functii. Variabilele statice si externe neinitializate la start primesc valoarea zero. Cele automatic si register au continut nespecificat (probabil "gunoi"). Cind intr-un initializator se aplica unui scalar (pointer sau un obiect de tip aritmetic) el consta din expresie singulara posibil in paranteze. Valoarea initiala a obiectului se obtine din expresie; aceleasi conversii ca pentru atribuire se folosesc. Cind o variabila declarata este un agregat ( structura sau tablou) atunci initializatorul consta dintr-o lista de initailizatori separati prin virgule in parantze (acolade) scri si in dinea in care cresc indicii sau in orinea membrilor. Daca numarul de initializatori este mai mic decit al membrilor se impune restul cu 0. Nu se initializeaza uniuni sau agregate de tip automatic. Acoladele se pot elimina. Daca un initilizator incepe cu acolade stinga atunci va urma o lista de initializare cu initializatori despartiti stinga prin virgule pentru membrii agregatului; este eronat sa existe mai multi initializatori decit membri. Daca initializatorul nu incepe cu acolada stinga atunci se iau din lista numarul necesar de elemente pentru agregatul curent, restul lasati la dispozitia agrgatului urmator. De exemplu: int xai=A1, 3, 5S; x este declarat si initializat cu un tablou cu o dimensiune care are trei membri. float ya4ia3i=A A1, 3, 5S, initializeaza prima linie adica y(0) A2, 4, 6S, care este ya0ia0i, ya0ia1i si ya0, 2i A3, 5, 7S, apoi se initializeaza liniile ya1i si ya2i S; ya3i se inittializeaza cu 0. Acelasi efect se obtine cu: float ya4ia3i=A 1, 3, 5, 2, 4, 6, 3, 5, 7 S; Initializarea pentru y incepe cu acolada stinga, dar pentru ya0i nu, de ci se folosesc trei elemente din lista. Urmatorele trei sint luate pentru ya1i si ya2i. Deci: float ya4ia3i=A A1S, A2S, A3S, A4S S; initializeaza prima coloana a lui y (privit ca un tablou cu doua dimensiuni) si lasa restul pe zero. Si: char msgai="syntax error on line %s/n"; arata un tablou de caractere a carui membri sint initializati cu un sir. 8. 7. Nume de tipuri In doua contexte (pt a se specifica explicit o expresie cu ajutorul unei distributii (N. T. cast) si ca si argument pt size of) este de dorit a se specifica numele unui tip de data. Aceasta se realizeaza folosind "nume de tip" care este in esenta o declaratie pt un obiect de tipul respectiv care omite numele obiectului. type-name: type-specifier abstract-declarator. abstract-declarator: empty (abstract-declarator) *abstract-declarator abstract-declarator() abstract-declaratoraconstant-expression opti Pentru a se evita ambiguitatea in constructia (abstract-declarator), abstract-declaratorul nu trebuie sa fie vid. Cu aceasta restrictie se poate identifica unic locatia din abstract declarator unde va apare declaratorul daca constructia a fost un declarator intr-o declaratie. Tipul de nume este acelasi cu tipul unui identificator ipotetic de exemplu: int tip->intreg int* pointer la (catre) intreg int*a3i tablou de 3 pointeri la intregi int(*)a3i pointer la un tablou format din 3 intregi int*() functie care returneaza un pointer la un intreg int(*)() pointer la o functie care returneaza un intreg |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|