Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Declaratii in C
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

x5i8iu
Declaratiile sint folosite pt a specifica interpretarea pe care C o da fiecarui identificator; nu fac in mod necesar si rezervarea de memorie pt respectivul identificator. Declaratiile au forma: declaration: decl-specifiers declarator-list opt;

Declaratorii din lista de declaratori contin identificatorii de declarat. Specificatorii de declaratii constituie o secventa de specificatori de tip si clase de memorare: decl-specifiers: type-specifier decl-specifiers opt sc-specifier decl-specifiers opt lista trebuie sa fie unica (self consistent) in exemplul descris mai jos. (N.T. -sc=storage class)


8. 1. Specificatori de clase de memorare

Acestia sint: sc-specifier: auto static extern register typedef specificatorul "typedef" nu rezerva memorie si este numit
"specificator" de clasa de memorie " doar din motive sintactice; se diacuta la &8. 8 sensurile diverselor claselor de memorare s-au discutat in &4.

Declaratiile auto, static si register servesc ca definitii pt ca cauzeaza o rezervare de memorie. La extern trebuie sa existe o definire externa (vezi &10) pt identificatori dati undeva in afara functiei unde ei au fost declarati.

Declaratia register este mai des vazuta ca o declaratie auto impreuna cu o alertare a compilatorului ca aceste varaibile vor fi utilizate des. Doar citeva declaratii de acest tip sint efective. Mai mult doar varaibilele de anumite tipuri vor fi stocate in registre; la PDP11 acestea sint int, char si pointeri.
O alta restrictie se refera la variabilele registru.
Operatorul & (care lucreaza cu adrese) nu li se poate aplica programele create pot deveni mai mici mai rapide dintr-o utilizare de declaratii register folosite corespunzator, dar inbunatatiri viitoare lae generarii de cod pot sa le faca necesare.

Cel putin un specificator de tip memorare poate fi dat intr-o declarare. Daca lipseste el este considerat auto in interiorul functiei, si extern in afara ei. Exceptie: functiile nu sint niciodata automatic.





8. 2. Specificatori de tip type-specifier: char short int long unsigned float double struct-or-union-specifier typedef-name.

Cuvintele long, short si unsigned pot fi privite ca si adjective; urmatoarele combinatii sint aceptabile. short int long int unsigned int long float

Sensul ultimei constructii este acelasi cu double. Altfel cel mult un specificator de tip poate fi dat intr-o declaratie.
Daca specificatorul de tip lipseste el este considerat int.

Specificatorii de structuri si reuniuni vor fi discutati in &8. 5, declaratiile cu typedef sint discutate in &8. 8.


8. 3. Declaratori

Lista de declaratori care apare intr-o declaratie este o secventa separata prin virgula de declaratori, fiecare trebuind sa aiba o initializare. declarator-list: init-declarator init-declarator, declarator-list int-declarator: declarator initialiser opt.

Initializatorii sint discutati in &8. 6. Specificatorii dintr o declarattie indica tipuri si clase de memorare a obiectelor la care se refera declaratorii. Declaratorii au sintaxa: declarator: identifier
(declarator)
*declarator declarator() declaratoraconstant-expression opti

Gruparea este ca la expresii.


8. 4. Sensul declarartorilor

Fiecare declarator este o afirmatie de genul ca atunci cind o constructie de aceeasi forma ca si declaratorul apare intr-o expresie, va produce un obiect de tipul si clasa indicata. Fiecare declarator contine doar un identificator;acest identificator se declara.

Daca doar un identificator apare ca declarator, atunci el va avea tipul indicat de specificatorul de la inceputul declaratiei.

Un declarator in paranteze este identic cu un declarator fara atribute, dar amestecarea declaratorilor complecsi poate fi alterat prin paranteze. Vezi exemplele de declaratie.

Acum sa ne imaginam o declaratie

T D1 unde T este un specificator de tip (ca int) si D1 este un declarator. Sa presupunem ca aceasta declaratie face ca identificatorul (N. T. din declarator) sa aibe tipul "..."unde "
" este gol daca D1 este doar un identificator pur si sipmplu (asa ca tipul lui X din "int X" este doar int ). Daca D1 are forma:

*D tipul identificatorului continut este "...pointer la T".

Daca D1 are forma

D() atunci identificatorul continut are tipul "... functie ce returneaza T. "

Daca D1 are forma Daconstant-expressioni... sau Dai, atunci identificatorul continut are tipul "...tablou de T". In primul caz expresia constantei este o expresie a carei valoare este determinabila in momentul compilarii si care are tipul int
(expresiile constanta sint definite precis in &15). Cind mai multe specificatii de tsblou sint adiacente se creaza un tablou multidimensional; expresiile constanta care specifica limitele tablourilor pot sa lipseasca doar pentru primul membru al secventei. Aceasta forama este folositoare daca tabloul e extern si definitia actuala, care aloca spatiu, este totusi data.
Prima expresie contanta poate fi omisa daca declaratorul este urmat de o initializare. In acest caz marimea se calculeaza din nr elemente precizate.

Un tablou poate fi constituit din unul din tipurile de baza prin pointeri dintr-o structura sau reuniune, sau din alt tablou (pt a genera tablouri cu dimensiuni multiple).

Nu toate posibilitatile date de sintaxa sint permise.
Restrictiile sint urmatoarele: functiile nu pot returna tablouri, structuri sau reuniuni dar pot returna pointeri spre asa ce va; nu exista tablouri de functii dar pot exista tablouri de pointeri spre functii. O structura sau o reuniune nu poate contine o functie, dar poate contine un pointer la o functie. Exemple: int i; *ip, f(), *fip(), (*pfi)(); decalara un intreg i un pointer ip la un intreg o functie f care returneza un intreg o functie fip care returneaza un pointer la un intreg un pointer pfi la o functie care reurneaza un intreg
Se compara ultimele. *fip() este *(fip()) declaratia sugereaza si aceiasi constructie intr-o expresie necesita apelul functiei fip si apoi indirectarea spre rezultat (pointer) se produce un intreg. (*pfi)() in declaratie parantezele sint necesare ca si intr-o expresie ca sa indice ca indirectarea prin pointeri la o functie produce o functie care este apoi chemata; va returna un intreg.

Alt exemplu: float faa17i, *afpa17i declara un tablou de flotante si un tablou de pointere spre numere flotante.

In final: static int x3da3ia5ia7i; declara un tablou de intregi, static, cu dimensiunile 3x5x7.
In detaliu X3d este un tablou de 3 articole; fiecare articol este un tablou de 5 tablouri; si fiecare din ultimul este un tablou de 7 intregi. Oricare din expresiile x3d, x3daii, x3daiiaji, x3daiiajiaki poate apare intr-o expresie. Primele trei sint de tip
"tablou", ultima are tipul int.


8. 5. Declaratorii de structuri si reuniuni

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;
S; contine
-un tablou de 20 caractere
-un intreg
-2 pointeri catre structuri similare

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:

=expression
=Ainitializer-listS
=Ainitializer-list, S initializer-list: expression initializer-list, initializer-list

Ainitializer-listS

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


8. 8. Typedef

Declaratiile a caror "clasa de memorare" este typedef nu definesc o memorie ci definesc identificatori care vor fi utilizati ulterior ca si cum ar fi cuvinte cheie de tip denumind tipuri fundamentale sau derivate. typedef-name: identifier

Rorul unei declaratii continind typedef este ca orice identificator care apare ca parte a oricarui declarator din interiorul (declaratiei) devine sintactic echivalenta cu cuvintele cheie de tip numind cuvintele de tip asociat identificatorului in modul desis in &8..De exemplu, dupa: typedef int MILES, *KLICKSP; typedef structAdouble, int;Scomplex;

Constructiile

MILES distance; extern KLICKSP metricp; complex 2, *zp; sint declaratii legale; tipul lui distance este int, al lui metricp este "pointer la un int", si al lui z este structura specificata; zp este pointer la respectiva structura. typedef nu introduce tipuri noi, numai sinonime pt tipuri care se pot specifica si altfel. In exemplul distance este considerat a avea exact acelasi tip ca orice alt obiect int.


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta