Sunteți pe pagina 1din 332
original: C++ THE COMPLETE REFERENCE Traducare dupa edit originald in limba englez’, publicata de Osbome McGraw-Hill Copyright © 1995 McGraw-Hill Book Company International (UK) Limited All rights reserved. No part ofthis publication may be reproduced, stored in 2 retieval system, or transmitted, in any form or by any means, electronic or mechanical, photocopying, recording or otherwise, without prior permission of McGraw-Hill Book Company International (UK) Limited. Copyright © 1997 Teora Prima editie: 1997 Rotiparitd: aprile 1998 ‘Toate drepturle asupra versiunii in imba romana apertin Edituri Teora, Reproducerea integrala sau partiald a textului sau allustratior din aceasté carte este posibilé numai cu acordul prealabil scris al Editufi Teora Distributie Bucuresti: Bedul Al. |. Cuza nr. 99; telMax: 222,45,93 Sibiu: Sos. Alba lulia nr. 40; tei: 069/21.04.72; fax: 069/29.51.27 Bacau! Caiea Marasesti nr. 5; tel.fax: 034/18. 18.26 Teora ~ Cartea prin posta OP 79-80, cod 72460 Bucurest, Romania Tel/Fax: 252.1431 Teora CP 78-20, cod 72450 Bucuresti, Romania Fax: 210.9828 NOT 2394 CAL C++, MANUAL COMPLET ISBN 973-601-595-5, Printed in Romania CUPRINS Prefatd Parteat Baza limbajului C++: Limbajul © 1. O privire de ansamblu asupra limbajului C Originite timbajuiui C++ C este un limbaj de nivel mediu C este un limba] structurat C este un limbaj al programatorului Forma unui program in C Biblioteca gi editarea legaturilor Compilarea indesendenta Utilizarea unui compilator de C++ pentru a compila programe in C 2. Expresii Cele cincitipuri de date de baz’ Modificarea tipurilor de baz’ Nume de identi Variabile Unde se dectara variabilele Variabile locale Paramotri formal Variabile globaie Modelatori de acces const volatile xvil Specificatori de clase de stocare extern Variabile statice Variabile locale statice Variabile globale statice Variabile de tip register Inilializari de variabite Constante Gonstante hexazecimale si octale Constante de tip sir Constante de tip backslash caracter Operatori Operatorul de atribuire Conversit de tip la atribuire Atribuiri multiple Operatori aritmetici Increment si decrement Operatori relationali gi logici COperatori de actiune pe biti Operatorul ? Operatorii & si * Operatorul din timpul compildri, sizeof Operatorul virgul’ Operatorii punct (. ) si sageata (-> ) Operatorii () $i] Rezumatul prioritatilor Expresii Ordinea evatuarii Conversia automata in expresit Modelatori Spatieri si paranteze Prescurtari in C Instructiuni Adevarat si Fals in C Instrucfiuni de selectic it it imbricat Scara if-else-if Alternativa ? Expresii de conditionare switch Insteucfiuni switch imbricate vl Instructiuni de iterare Bucla for Versiuni ale buclei for Bucla infinita Bucle for f8r8 corp Bucla while Bucla do-while Instructiuni de salt Instructiunea return Instructiunea goto Instructiunea break Functia exit Instructiunea continue Instructiuni de tip expresie Instructiuni bloc Matrice gi siruri Matrice cu 0 singurd dimensiune Crearea unui pointer Ia 0 matrice Transmiterea matricelor unidimensionale c&tre Funct ‘Siruri Matrice bidimensionale Matrice de giruri Matrice multidimensionale Pointeri de indexare Infializarea matricetor Infializarea matricelor {88 marime Un exemplu de joc .O gi X” Pointeri Ce sunt pointer? Variabile de tip pointer Operator pentru pointeri Expresii cu pointer Insiructiuni de atribuire pentru pointer Altmetica pointertior Compararea pointertor Pointer gi matrice Matrice de pointeri Indirectare multipl& Intializarea pointerior Pointeri c&ire functi Funct de alocare dinamica tn © Probleme ale pointerlor vit 125 127 Functii Forma general a unei functii Stera de influen\& a functilor Argumentele functiei Apelare prin valoare, apetare prin referint& Crearea unei apelari prin referint& Apelarea functillor cu matrice arge gi argy - Argumente pentru maing Instructiunea return Revenirea dintr-o functie Valori retunate Funcfii care returneazi valori ce nu sunt de tip intreg Prototipurile functilor Returnarea pointerilor Funetit de tipul void Ce returneaz maing ? Recursivitate Declararea listelor cu numar variabil de parametri Deciaratii de parametri pentru functii in mod clasic si modem Caracteristici de implementare Parametri si functii de utlitate general Eficient’ Cd Structuri, uniuni, enumerdci gi tipuri definite de utilizator Structuri Accesul la membrii structurii Atribulti fn structur Matrice de steucturi Transmiterea structurilor c&tre functii Transmiterea membrilor structurlor cétre functi ‘Transmiterea structurilor intregi edtre functii Pointer’ la structuri Declararea unui pointer la 0 structurd Utilizarea pointerior fa structuri Matrice si structuri in interiorul structuriior CAmpuri de biti Uniuni Enumerari Utilizarea lui sizeof pentru asigurarea portabilitii ypedet vit 131 132 132 133 133 134 195 198 141 141 143 145 147 143, 150 150 151 153 153 154 154 155 157 158. 160 161 162 162 162 163 185 165 165 168 189 172 175 7 179 Vo ta consola ‘© not cu important practic’ Citirea si scrierea caracterelor © problema cu getchard, Alternative la geichar() Citirea gi scrieres sirutilor NO de la consolé, formatate printt() Afigarea caracterelor Afigarea numerelor Afigarea une adrese Speoificatorul %n Modelatori de format Specificatorul pentru marimea minima a c&mpului Spocificatori de precizie Alinierea iesirilor ‘Manevrarea altor tipuri de date Modelatorii*si# scant() Specificatori de format Intr&ri de numere InteBri de intregt fra semn Citirea caracterelor individuale folosind scant() Citirea sirurilor Introducerea unai adrese Specificatorul %n Utiizarea speciticatorulul pentru seturi Eliminarea spat lor ibere nedorite Caractere care nu sunt de tip spattu liber in sirul de control Trebuie s4 transmitel{ adrese in scani() Modelatori de format ‘Suprimarea intririlor Wo cu figiere VO pentru ANS! C fat de VO pentru Unix UO in C fata de i10 in C++ Streamuri $i figiere Streamuti Streamuri de tip text ‘Streamuri binare Figiere Bazele sistemuul de fisiere Pointerul fisierciut 181 182 183 184 184 185 188 188 189 189 191 191 192 192 193 194 195 195 198 197 197 197 198 198 199 199 199 200 200 201 201 202 203 204 208 205 205 205 205 206 206 207 10. 1, Deschiderea unui figier Inchiderea unui figier Scrierea unui caracter Citirea unui caracter Utitizarea functilor fopend, gete0)., puted $I foloseo Utitizarea functiei feof) Lucrut cu girurle: fputs0 si fgets. rewind() ferrord) Stergerea fisierelor Golirea unui stream fread( si fwrite Utilizarea tui fread) i fwriteQ) fseek() $i V0 in acces aleatoriu fprintfQ si fscanfQ, Streamurile standard Conectarea /0 la consola Ulilizarea functiei freopen() pentru redirectionarea streamurilor standard Preprocesorul, Comentarii Preprocesorul define Definirea functilor macro error #include Directivele de compitare conditionata Hit, Helse si endif Hifdet si Bifndet #under Utiizarea operatorulul defined #line pragma Operatorit pentru preprocesor # si ## Nume de macro predefinite Comentarii Partea a lla C++ - Caracteristici specifice © privire de ansamblu asupra lui C++ Originile timbajului C++ Ge este programarea oriental pe obiecte? 208 208 210 210 att 213 24 215 216 218 219 219 220 221 223 224 225 226 227 228 228 230 231 231 232 232 235 236 236 237 237 238 239 230 243 244 245 12, 13. Incapsularea Palimorfism Mostenirea Programarea in stilul C+ Oprivire mai atenta asupra operatorilor de WO Declararea variabilelor locale Prezentarea claselor C++ F.notii supraincdrcate (overload) Supraincircarea operatorilor Mostenirea Constructor’ si destructori Cavintele cheie In C++ Forma generala a unui program in C++ Clase gi obiecte Clase Structur si clase Uniuni si clase Uniuni anonime Functii prietene Case prietene Functi inline Dafinicea functillor inline intr-o clas Functii constructor cu parametri. Funcfile constructor cu un parametru: un caz speciat Membrii de tip static ai claselor Membri static de tip date Functii membre statice nd sunt executati constructorii si destructor ‘Operatorul de specificare a domeniului Clase imbricate Clase locale ‘Transmiterea obiectelor catre functii Returnarea obiectelor Atribuirea obiectelor Matrice, pointeri si referinte Natrice de obiecte Natrice initializate / matrige neinifjalizate Pointeri cdtre obiecte Fointeri de verificare a tipului Fointerul this Fointeri cétre tipuri derivate cee x1 246 246 247 247 250 251 253 257 280 260 285 270 an 272 275 277 279 280 284 285 288 289 291 292 292 295 297 298 300 300, 301 303 304 307 308 310 ait 313 313 315 14, 48. Pointeri c&tre membriiclasei Referinje Parametri de referinta ‘Transmiterea referin{elor o&tre obiecte Returnarea referintelor Referinfe independente Restrict pentru referinte © problema ae stit Operatorii de alocare dinamic& din C++ Alocarea de memorie obiectelor ‘Suprainearcarea functillor si a operatoritor Supraincdrcarea functillor ‘Supraincarcari de functi $1 ambiguitati Anacronisme pentru supraincarcare Supraincdrearea functillor constructor Gasirea adresei unei functil supraincarcate ‘Supraincarcarea operatorilor Crearea unei functt operator membru Crearea operatorilor de incrementare si de decrementare ‘cu prefix si cu sufix Supraincdrcarea operatorilor prescurtati Restrict’ la supraincarcarea operatorilor Supraincdircarea operatorilor folosind o functie friend Folosirea unui friend pentru a suprainedrca ++ sau Functile friend operator adauge flexibilitate Supraincarcarea operatorilor new si delete Supraincdrcarea operatorilor new gi delete pentru matrice ‘Supraincarcarea unor operatori special Suprainodrcarea pentru [] ‘Suprainearcarea pentru () Suprainodrcarea pentru -> Supraincdrcarea operstorului virguld Mogtenirea Controlul accesutul la clasa de haze Mostenirea si membrit protejati Mostenirea protected a clasei de baza Mostenirea din clase de bez multiple Constructori, destructari si mostenire Cénd sunt executate functiie constructor si destructor Transmiterea parametritor spre constructor clasei de bazd Permiterea accesulyi Clase de baza virtuale XI 318 320 321 324 325 328 327 327 328 331 337 338 340 343 344, 346 347 347 352 353 354 356 358 361 365 367 368 371 373 374 377 378 380 384 385 385 386 390 304 396 16. 47. 18, Funetii virtuale si polimorfism Funcfille virtuale Atributul virtual este mostenit Funofille virtuale sunt jerarhizate Functil virtuale pure Clase abstracte Utiizarea functiior virtuale Legaturiinitialefulterioare Bazele sistemului de v0 din c++ Streamuriin Co Ciasele de bazd penta etreamuri Streamar prede'nite in C++ iro formatate Formatarea folosind membri ios Aetivarea indice onor de format Dezactivareaindcatoror de format © forma suprapusa a funetii set) Examinarea inicatortor de format ivarea turer incieatoriior Uittearesfuncilor wath, precision $0 Uilizarea manipulatorior pentru VO formatate Supraincdreares operatrior << i> Grearea propriler dvs, tuneiide serie rearea proprilor extractor Grearea proprio dv, tunel de manioulare Grearea manipuatorior fara paramet Grearea manipuatorior parametizat 6 notia despre vechea bibiotecd de clase pentru streamur VO cu figiere in c++ fstream.h si clacele de figiere Deschiderea gi inchiderea unut figier Citirea si scrierea figierelor de text NO de tip binar get si puto, read) si writed Mai multe funcfs get) getline) Detectarea EOF Funetia ignored) peekQ si putback) flusho, XuL 401 402 405 408 408 an ait 414 415 416 416 47 47 418 419 421 421 424 426 427 429 431 431 437 440 440 443 447 449 450 450 453 455 455 487 460 461 462 484 485 485 49. 20. 24 22. Accesul aleator Obtinerea pozitiei curente dintr-un fisier Starea de IO UO $1 figiere adaptate oO bazate pe matrice Clasele bazate pe matrice Crearea unui stream de lesire bazat pe matrice Utilizarea unei matrice ea intrare Folosirea functiilor membre tip pentru streamuri bazate pe matrice ‘Streamuri de intrarefiesire bazate pe matrice Accesul aleator in cadrul matricelor Utilizarea matricelor dinamice Manipulatori si operatii de 1/0 bazate pe matrice Functii create de utilizator pentru extragere si insertie Utilizdri ale formatarit bazate pe matrice Sabloane Funct generice © functie cu doud tipuri generice Suprainc&rcarea explicit& a unel functii generice Restrict penteu functia generic& Aplicarea functilor generice O sortare genericd Compactarea unel matrice Clase generice Un exemplu cu doud tipuri de date generice Crearea unei clase generice de matrice Tratarea exceptillor Bazele trataril exceptiilor Folosirea instructiunilor catch muttiple ‘Optiuni de tratare a exceptiilor Preluarea tuturor exceptillor Restriciii pentru excepti Relansarea unei exceptii Aplicati ale tratdrit exceptillor Elemente diverse si caracteristici avansate Argumente implicite pentru functit Utlizarea corecté a argumentelor implicite Argumente implicite sau supraincarcare? Crearea funciillor de conversie xIV 466 489 470 472 477 478 478 480 482 483 484 484 486 487 489 491 492 494 495 497 498 498 499 S01 508 506 509 510 518 817 817 520 521 523 525 526 530 531 532 23. 24, Constructori pentru copii de obiecte lnitializare dinamica Functii membre const si volatile Utlizarea cuvantului cheie asm Specificatii pentru editarea legaturilor Caracteristici nol adéugate de standardul ANSI C++ propus Noi operatori de modelare Tipul de date bool Utilizarea unui nume pentru zona de influent& Identificarea tipului in timpul ruldct Constructori explicit Utiizarea operatorulul mutable Tipul wehar_t Figiore antet noi Diferente intre ¢ si C++ Partea alla Cateva aplicatii de C++ © ciasa de tip sir Definirea unui tip de sir Clasa St’Type Functille constructor si destruetor NO cu sieuri Funetille de atribuire Concatenarea Excluderi de subsiruri Operatorit relational Diverse functii pentru siruri Intreaga clasa StrType Utitzarea clasei StrType © ciasa pentru afigarea ferestretor Forestrele Crearea unor functii de suport video Sistemul video al calculatorului ‘Accesul la BIOS. Determinarea locatiei memoriei RAM video Sorierea in memoria RAM video Pozitionarea cursorului Clasa fereastra Afisarea si slergerea unei ferestre UO pentru ferestre xv 536 539 ‘540 540 541 542 543 544 544 545 548 549 549 549 549 353 554 556 558 559 581 562 584 587 568 589 578 581 582 $83 583 585 586 587 588 589 592 595 Intregul sistem de feresire 600 | tice deeeacat es 25. O clas gonerck dette intuit a O clas ample ite done eae ea Parca nerao ais Pneen aan igare ae s0 Despre autor Gasirea unui obiect din list’ 623 Herbert Schildt este cel mai cunoscut autor de manuale si programe de C/C++ din Ui eetieuide wooeeron a a set 221M iceape tims! Gigs wae escramare see vin rtees anmecta Chotea int ove renee See ete S231 umeeron taxmtare neneve Uneaten tases name eared Varatiea gversko pace ce aca Bao asafe ceaalal Et oae neegearicrge oapoe Os Tes Goats Remranes Clasa generic pentru liste dublu inkintuite 633. ( lanual Complet), acum la cea de a treia editie, Teach Yourself C (invata Alte implementari 642, singur C) si Teach Yourself C++ (invata singur C++). A mai scris, de asemenea, gare Fis aienisiod anor camsarl ccs anne Grecsuntenicrs ueeeas ibliotecile de clase standard propuse 643 95 Programming in C and C++ si numeroase alte c&rti. Schildt este pregedintele ee Oneal carrsaig ten Caan ecoeae meee x Tetata Noutatea cu adevaral importanta in aceasta carte este aceea cd a inceput lucrul til tania Gettin acer acne taunts tae log 9 Toesn bit aes c in, de popramar.de Saat profesional mona ecg atopiayie sonisan ual anceu tanens asters oes pa Sancenaries hr dock Cr tse parte cn urveru! rogram deja de mal mull an, este nine rene edel ed pieced Spee mo i trommnar. bewat te limbajul C, C++ adauga extinderi care admit programarea orientata pe obiecte. larruunentcn cee suuttesaites ia accciees pesrananlonstat xvi Bese einen sas cost pinnacle nce aainan weaicees In aceast& privin{d C++ reuseste admirabil C++ este constrult pe structura limbajului C, Acum, in momentul in care seriu aceastd carte, C este inca cel mai popular si mal important limbaj de programare din lume. Deoarece reprezinta o dezvoitare si 0 extindere a sa, se asleaptd ca C++ 8-51 l&rgeascd in continuare sfera acceptati si utilizini, Forja gi flexibilitatea lui, ‘combinate cu faptul cd se bazeaz’ pe popularitatea limbajului C, ii asigurd deja locut in istoria programarit © carte pentru toti programatori Aceasté carte cuprinde atat caracteristicile de tip © ale limbajului C++, cat gi aspectele sale specifice. Totusi, cea mai mare atentie se acorda acelor ‘caracteristici care sunt propril imbajului C++, Deoarece multi cititori sunt deja familiarizati gi competenti in C, elementele preluate din © sunt prezentate separat de cele specifice imbajului C++, Acest fapt evitd ca programatori cunoscatori de C Sa se ,balaceasca” prin maldare de informatii pe care le cunoaste deja, ei putand ‘rece direct la sectiunile din carte care acopera caracterisliile specifice limbajului ore Acest manual de referint& pentru C++ este destinat tuturor programatoritor in C++, indiferent de nivelul lor de experien(S. El presupune, ins&, un cititor capabil & creeze macar un program simplu. Daca de-abia acum invajati C++, aceasta carte va va fio companie excelent& pentru orice program explicativ C++ si va servi ca surs& de rspunsur la intrebarile dvs. De aceea, fie cé sunteti un programator cu experient& in © care Tnvatdi C++ fie tun novice in programare, veti gsi aceasta carte ca fiind de mare ulilitate, Continutul Aceasta carte desorie in detaliu toate caracteristicile limbajulul C++, inclusiv fundamentul su: C. Cartea vate fuipai (td In tel part, care cuprina: Bazele limbajului C = Limbajul G++ = Exemple de aplicatii C++ Partea intai oferd 0 prezentare cuprinzatoare a bazel limbajului C++: limbajul C. Aici este descris in intregime standardul ANSI C, Cunoasterea in profunzime a limbajului C este o premisa obligatorie pentru invatarea limbajulul C++, Partea a doua prezinta in detaliu extinderile si imbundtatirle addugate limbajului C de cétre C++, Partea a {reia oferd exemple practice de aplicalii de C++ si de programare orientatd pe obiecte. XVIII Partea | Baza limbajului C++: Limbajul C artea intai a acestel clr prezintA caracteristicile de tip C ale limbajului C++, Dupa cum probabil sti, C++ este construit pe baza limbajului C. C++ a fost inventat pornind de la C, Acestuia I-au fost adéugate noi facilitati si extinderi destinate acceptanii programaril orientate pe obiecte (OOP). Dar aspectele de tip C ale limbajului C++ nu au fost niciodat’ abandonate. Tn forme obisnuitd, G++ este o versiune dezvoltata a jimbajului C standard ANSI, are este, de fapt, un document de baza pentru standardul ANSI C++ propus. Din acest motiv, orice compilator de C++ este, prin definitie, si un compilator de C, Deoarece C++ este constrult pe baza limbajului C, nu puteti programa in C++ fra sa stiti s8 programati in C. Mai mult, mare parte dintre conceptele fundamentale din C sunt astfel si pentru C++ Atal timp cat C++ este un super-C, cele descrise in prima parte a cdi sunt pe deplin aplicabile gi pentru C++. Caracteristicile proprit acestuia sunt detaliate in Partea a Doua. Motivul pentru care aspectele de tip C ale limbajului C++ sunt prezentate intr-o sectiune proprie este intentia de a face mai usor programatorilor ‘cu experienté in C accesul rapid la informalii despre C++ fara sf se .baléceasca prin maidére de informafii pe care le cunosc deja. Pe parcursul intregii Parti intai sunt eviderfiate diferentele minore intre C si C++. “Capitolul 1 1 a et 0 privire de ansamblu asupra limbajului C PQ c++: manual complet 9) c++: Manvel complet copul acestui capitol este si prezinte 0 vedere de ansamblu a limbajulul de programare C, a originilor, utlizdrilor si a filosofiei care sta la temelia lui. Deoarece C++ este construit pe baza limbajului C, acest capitol oferd 0 important perspectiva istoricd asupra originilor sale. Originile limbajului C++ © a fost inventat si implementat prima oard de Dennis Ritchie pe un DEC PDP-11 care utiliza sistemul de operare UNIX. C este rezultatul unui proces de dezvoltare care a inceput cu un limbaj numit BCPL, creat de Martin Richards; BCPL a influenjat un limbaj numit B, care a fost inventat de Ken Thompson. In anil ‘70, B a dus la dezvoltarea limbajului C. Muli ani standardul de facto pentru C a fost versiunea ce insofea sistemul de ‘operare UNIX. El a fost descris pentru prima dati in The © Programming Language (Limbajul de programare C) de Brian Kemighan si Dennis Ritchie (Englewood Cit, NJ: Prentice Hall, 1978). cat& cu cresterea popularitii calculatoareior personale, au fost create numeroase implementari de ©. A fost aproape un miracol c& acestea au fost ‘in mare masurd compatibile (Insemnand c3 un program seris intr-una din ele putea fi compilat de obicel cu succes ulilizand o alta). Totus, deoarece nu exista nici un standard, aplreau discrepante. Pentru a remedia acest fapt, in vara lui 1988 a fost stabilit un comitet pentru crearea unui standard ANSI (American National Standards Institute) care s8 defineascd o daté pentru toldeauna limbajul C. Procesul de Standardizare a durat gase ani (mult mai mult decat s-ar fi asteptat orice om rezonabil), in stagit, standardul ANSI C a fost adoptat in decembrie 1989, primele copii devenind disponibile la inceputul lui 1890, Astizi, toate compilatoarele C/C++ se supun slandardului ANSI C. De asemenea, standardul ANSI C este 0 bazii pentru propunerea de standard ANSI C++ C este un limbaj de nivel mediu Co et aera aS at paseata nel sears soma clam ia seats mie ampere sat estore os wh yeni re Se ree cet af on ensinelveties ec sete thax tenmtanelipaauiseseriee Testu | prezinta locul limbajului C in gama limbajelor informatice. { eee te cel cron ccar a eames teemena | de baz cu care functioneaza calculatorul. [n cluda acestui fapt, codul C este, de asemenea, foarte portabil. Portabilitatea inseamnd cd un software scris pentru un anumit tip de calculator sau sistem do operare se adapteazd ugor pe oricare altul De exemplu, un program este portabil dac&, fiind scris pentru sistemul DOS, puteti face usor conversia sa, astfel incat sé ruleze in Windows, | Copitoll 1: © privre de ansamblu asupra limbojul Limboje do nivel inat Ada Modula-2 Pascal coBoL FORTRAN, BASIC oH c FORTH LUmboje de nivel meaty Umboje do nivel scazut Macro-asambior Limbaj de asamblare aa [nee ma Toate Imbajele de programare accopta conceplul de tip de date. Un tip de date defineste 9 multime de valori pe care le poate lua o variabild, impround cu un ansamblu de operatii care pot fi efectuate asupra sa. Tipurile uzuale de date sunt intreg, caracter si real, Chiar dacd C are cinct tipuri de date de baz, el nu este un limbaj centrat pe tipurile de date, asa cum sunt Pascal 5i Ada. C permite aproape toate conversiile de tipuri, De exemplu, puteti amesteca intr-o expresie date de tip caracter au date de tip intreg. ‘Spre dzosebire de un limbaj de nivel inalt, C nu efectueaza aproape nici un control al erorilor in timpul rulgril. De exemplu, nu se face nici o verificare de fneadrare in dimensiunile unei matcioe. Acest tip do control cade in responsabilitatea programatorului, . Th aceeagi ordine de idei, C nu solicité o compatibilitate strict intre un parametru si un argument. Oupa cum probabil still din experienta de programator, tun limbaj de nivel inait cere ca tipul unui argument sé fie (mai mult sau mai putin) identic cu cel al perametrului c&ruia ti va da valoarea sa. Restrictia aceasta nu este ins valabilé si pentru C, C permite ca un argument sé fie de orice tip, atat timp ‘cat el poste fi convertit convenabil in tipul de data al parametrului, conversie pe care deal:fel C 0 efectueazd automat. caréoteristio& speciald a limbajului C este posibiltata de a opera direct cu bil ‘octeti, cuvinte gi pointeri, ceea co Il face foarte potrivit pentru programare la nivelul de sistem, unde toate aceste operatii sunt foarte necesare SEI + enue compist Un alt aspect important al limbajului C este c& el are doar 32 de cuvinte-cheie (27 din standardut intial al tui Kernighan si Ritchie gi cinei addugate de comitetul Ge standardizare ANS); ele sunt comenzile care formeaza limbajul C. Limbajele de nivel inalt au, in general, de cdteva ori mai multe cuvinte chele, De exemplu, cele mai multe versiuni de BASIC au cu mult peste 100 de cuvinte-cheiet C este un limbaj structurat {in experienta dvs. anterioard ca programator, probabil c& ai auzit termenul ‘tructuré-in-blocuri aplicat unui limmbaj de calculator. Chiar dac& termenul -Structurat in blocuri" nu se aplicd strict limbajului C, acesta este numit in mod Curent mai simplu, fimbaj structurat, Existé multe similitudini cu alte limbaje structurate, aga cum ar fi ALGOL, Pascal si Modula-2 SG, NOTA: Motivul pentru care © (ca gi C++) nu este, practic, un limba) structurat in blocuri este aceta c8 limbajele cu aceasta caracteristica permit 8 fie declarate proceduri sau functl in interiorulaltor proceduri sau funoti Astfel, deoarece C nu permite crearea de functil In interiorul funcfillor, ef nu ‘poate fi numit formal structurat in blocuri | Caracteristica distinctiva 9 unui limba] structurat este compartimentarea codului $i a datelor, Aceasta este capacitatea unui limbaj de a despair si a ascunde de Festul unui program toate informatile si instructiunile necesare efectuali une! anumite sarcini. © modalitate de realizare a compartimentarii este utllizarea de subrutine care folosesc variabile locale (temporare), Utilizand variabile locale, uteti scrie modulele asfel incat ceea ce se intampla in interiorul lor s& nu ail efecte in alte sectiuni ale programulul. Avand aceasté facilitate, programelor in G li ‘Se poate impair foarte usor codul in sectiuni. Ca s& ereati functif compartimentate, webuie 8 stti doar ce face funclia, nu gi cum 0 face. Retineti cd utilizarea excesiva a variabilelor globale (variabile cunoscute de intreg programul) permite Greselilor $8 se strecoare in program, prin aparitia de efecte secundare nedorite. (Oricine a programat In BASIC standard cunoaste foarte bine aceast& problema) » Un program structurat va oferd o mare varietate de posibiitati de programare. | El include mai multe constructii de bucie, cum ar fi while, do-while $i for. Intr-un limbaj structurat, utilizarea instrucfiunii goto este interziss sau descurajati, aceasta nefiind forma obignuitd de control al programului (aga cum este, de exemplu, in BASIC standard $i tn clasicul FORTRAN). Un limbaj structural va Permite s& plasatiinstructiuni oriunde pe o linie gi nu necesita un concest strict NOTA: Conceptul de compartimentaro este dezvoitat foarte mult de extensia limbajului C, C++. Specific acestuia este faptul o& o parte a programulul poate s& controfeze foarte strict la care alte sectiuni este permis accesul. Capt: © pie de entmblyavpranboi EERE despre camp (asa cum ¢ fac cdteva din variantele mai vechi de FORTRAN). lat cAteva exemple de limbaje structurate si nestructurate: Nostructurate Structurote FORTRAN Pascal BASIC oo COBOL + c Modula-2 a steristicd a limbajelor Limbeelestueturte tind 8 fe moderne. Deft cara de programe mal vac es aasea ef nu ut sca. Ati, majnatea prosrratntorconseré cli imbajeesructurae este tat vor sd ao raion program ee ‘a limbajului C. in C, functiile sunt constructiile de blocuri in care are loc Intreaga saunas progearnu ele perm deel i sree courier pen saci havaasie a pepe icin mowataarenscosira Dundes coca uch ex utear cart in ds str igus etc seanaore nate pi le programa), Centon ce un desi ithosre ese foarte important preeetele mar ta coe edu! un prowarmator nu tbule sd etecose wena una : 1 cod in ¢ est tizarea imo dea scra 9 do'aconpurimerta un cod n ¢ eso utlizarea bioeunr dood boos ou oa un grap ae sictuni altura gt, trtate ‘caun singur element. ir C, creati un bloc de cod incluzand intre acolade un grup de instructiuni. In urmAtorul exemplu, ae Pi scant ("40", 1 (x < 10) { nté("Prea jos, mai incearea 0 data.\n eae i sunt ambeleexecutate dacd x instutiun’ de dupa it ctr parantze sunt ambel este mal mic dedt 10. Asoste Gout inseutun, impound eu sce ropcz tn bloc de cod Ele consiule un singur element loge: una din instruct poate exectta far ca 8 se enccute 9 cealat. Retin of orice instveiune Tn C poate f simpld sau un toc de instruct Blocunle de cod permit roalizarea frltor algo eu impezimo elegant i eftent®: Mal mut, ee 2] brogramatoru si cartes adevrata natura algoriimul C este un limbaj al programatorului rogramator urprinzator, dar nu toate imbajele de programare sunt pent prog Ganattevd ts exempoteslosice de imbue pent ulizator, COBOL s! BASIC, HG c+: ment compit COBOL au a fost proiectat pentru a indulci soarta programatorilor, pentru a mari siguranta in exploatare a codului creat si nici chiar pentru a creste viteza de scriere | @ acestuia. COBOL a fost proiectat mai degrabé, cel putin in parte, pentru a Permite utilizatonlor sa citeascd si, s-ar parea, desi este putin probabil, 58 In{eleag’ programul. BASIC a fost creat in principiu pentru a permite utilizatorilor ‘8 programeze un calculator pentru a rezolva probieme relativ simple. In schimb, © (ca i C++) a fost creat, influentat si testat de cdtre adevarati programatori. Rezultatul final este acela c& C oferé programatorului exact ceea ce ‘igi doreste: restrict putine, motive putine de nemul{umire, structuri in blocuri, functii de sine st&titoare si un set compact de cuvinte-cheie. Utiliznd C, putoti s& atingeti eficienta codului de asamblare combinata cu structura limbajului ALGOL ‘sau Modula-2, Nu este de mirare c& C si C++ au ajuns cu ugurin{a cele mai r&spandite limbaje printre cei mal buni profesionisti ai programa Faptul c& puteti utiliza C tn focul limbajului de asamblare este un factor important pentru popularitatea sa In randul programatorilor. Limbajele de asamblare folosese reprezentarea simbolicd a codului binar efectiv pe care calculatorul il executé direct. Fiecare operatie a limbajului de asamblare reprezinta © singura actiune pentru calculator. Chiar daca limbajul de asamblare oferd programatorulul posibilitatea de a realiza sarcini cu flexibilitate gi eficient’ maxima, este evident dificil de operat cu el pentru dezvoltarea si depanarea unui program. Mai mult, deoarece limbajul de asamblare este nestructurat, programul final va fi un cod-spaghetti - o mas& incalcit& de sarituri, apelari $i indiei. Aceast& lips de structurare face programele scrise in limbaje de asamblare dificil de citi, de dezvoltat gi de intretinut. Probabil cd si mai important este faptul cd rutinele limbajelor de asamblare nu sunt portabile intre echipamentele cu unitati centrale de preluerare (CPU) diferite. Initial, © a fost folosit pentru programarea de sisteme. Un program de sistem formeaza o parte din sistemul de operare al calculatorulul sau al accesoriilor sale. De exemplu, urmatoarele sunt numite uzual programe de sistem: Wi sisteme de operare Bi Interpretoare W Editoare Compilatoare Bi Baze de date Foi de calcul © data cu cresterea in popularitate a limbajulul C, multi programatori au inceput 88 il utilizeze pentru a programa orice acliune datorit& portabilittii si eficientel sale. Deoarece exist’ compilatoare pentru orice calculator posibil, puteti preiua un od soris pentru un echipament,s4 il compilaii si s& 1l rulati pe un ailtul ou relativ Putine modificéri, Portabilitatea economiseste atat timp cat $i bani. Compilatoarele ceptol© pie de acon cre bce empl, mai compacte si dec produ cour oboe eare compacts rapide de extra ma camp se rede sestimajoiatencomplotearelor COBOL nun poaramator oe jl ie asalare exten tba oe place! © ofa viteza libel 358 ban sere rare pe a resiie an Paro au cn Modula Fess | rCeraator in posto rece 9s nd o Bbotecd de inet ca rama scare poate utiztal Bein etl sbu popu prowamare care poate liza mule 3 inc aitento,Deoarece permite = ba mai mu eh comple Fo er serd prograratorior posibiitateas& gesioneze Us0r Po thar uum minim de redundan 2 efor Forma unui program in C seo toma fe cuvinte-cheie care, combinate cu sintaxa formal, oamae C27 jintre ele au fost definite in versiunea C ate de cate comitetul ANSI C: enum, petu 12 prezinié ele Teehuess limpet de programare C.27 i orca Umar ct a fs 26 const, sane, oi moere do ¢(sC#+) au addugate ma mute cuvinteehele aa cna bine meclu de eperare. De exempls, multe comelstoare reece peta aaminatrare memoriam de proceszar 0000 i sre progeamare cu imbole mice pers 8.avea re a argos cuvine-chee sulimentae uiizate = ds _ ooo tect ier age Jnterrupt near pascal struct switch double int else Jong enum register typedet char extem return union float short unsigned for censt void signed continue default sizeof volatile efaul Bg c++: manvet complet Compiltorat dvs. poate 58 conn 1 oo see Mon otc x eee ate cuvintei-choie tn © san srs ee Scrise cu litera mica. In C, titere! ri Sehr fle este un cuvant-hees ELEE nu ate Nu pul oars gina un program in C= anume, nl ea arabs Seu er tume Toate programete tn const a in © const dn un sau mal mul are rebie ste orezent est noms man ean ncepe execute unl program. inirun cog wre be un lan a ceca co face progr Praolete con dae main) nueste un cuvantoher rata Incereat 8 foes malin) compte ora Deneral aun p F program in este prezentat in Figur biol de la 149 1a MM rpresint une tite ae aoe te functil. Singura functie id prima functie apelatd cand cris, main() contine in esenta e-compus din func de apelare, Chiar i cum ar fi, De exemplu, nit lume de variabilé deoarece, probabil, veti deruta unde Biblioteca si editarea legdturilor Din punct de vedere tehnic, doar din instructiunile pe ca pute cont un orogram vi ram lls funcional care cons ol. reatefecv, Tosh, aceasta eee nto declaratii globale Feturneaza-afiseaza main (ista de paranet: seeventa de instructiuni ) returneaza-afiseaza f1 (lista parametrs) Seeventa de instructiuni | seaza £2 (lista de paranetei) sung Fetucneaza-afiseaza fN (lista de pacametrs) | seeventa de instructiuni Copitolul 1: © privite de ansamblu azupra limbejulut ¢ Ef deoarece C nu asiguri in cadrul actualei definiri a limbajului nici o metoda de efectuare a operalillor de intrare/iesire (\/O). Ca urmare, majoritatea programelor includ apeluri la diverse functii continute i biblioteca standard. Toate compilatoarele de C se livreaz’ cu o biblioteca standard de functti care efectueaz cele mai vzuale sarcini, Standardul ANSI C specificd un set minim de functii care trebuie continute de biblioteca. Compilatorul dvs. va confine probabil multe alte functii. De exemplu, biblioteca standard nu defineste nici o functie grafic’, dar compilatorul dvs. probabil c& poseda cateva, & NOTA: Este impertant s& infelegeti cd C++ admite Intreaga bibliotec’ a standardului ANSI C. Astfel, toate funofile imbajului standard C sunt valabile In programele pe care le scrieti atat in C c&t si in C++. Desigur, C++ defneste, de asemenea, cateva functi de biblioteca ce fi sunt propel. Cei care au creat compilatorul au scris deja majoritatea {unctilor de utiitate general pe care le vetifolosi. Cand apelatj o functie care nu face parte din programul dvs., compilatorul isi gaminteste” numele ei. Apoi, editorul de legturi combind codul pe care -afi scris cu codul obiect ce I-a gsi In biblioteca standard, ‘Acest proces este num: linking (editare de legéturi). Unele compilatoare au propriul lor editor de legatur, in timp ce altele Ml folosesc pe cel standard, asigurat de sistemul de operare. Funefille din bibliotes4 sunt th format realocabil. Aceasta inseamnd ca adresele din memorie pentru divarse instructiuni fn cod maging nu au fost definite in mod absolut - au fost pastrate doar informatiile de deplasament (offset). Atunci cand programul dvs. este unit cu functile din biblioteca standard, aceste adrese relative din memorie sunt foloste pentru a crea adresele utilizate efectiv. Exist manuale tehnice si c&rfi care explic’ acest proces mai in detaliu, Dar, pentru a programa in C sau C++, nu aveti nevoie de mai multe amfnunte privind procesul efectiv de realocare. ‘Multe dintre functile care v3 vor fi necesare atunci cand veli scrie un program existd in biblioteca stardard. Ele se comportd ca blocuri pe care le pute{i combina Daca scrie{i o functie pe care o veti utiliza mereu, puteli s& o introduceti, de asemnenea, intr-o biblioteca, Unele compitatoare va permit sd o include in biblioteca standard; altele va obliga s& va creati o noua bibliotecd. In orice caz, codul va fi acolo, aslepland sé i! reutilizat. Compilarea independenta Multe din programele scurte sunt continute fn intregime intr-un singur figier sursé. Dar, o dati cu lungirea programului, va creste si timpul de compilare, care vai va pune rlbdarea la incereare, De aceea, C permite unui program sa fie cuprins in ‘mai multe figiere ce po! fi compilate independent. Cand ali compilat toate fisierele, lise editeazd legaturile, impreund cu orice rutind necesar3 din biblioteca, pentru a TR] c++: manual compet forma codul obiect complet. Avantajul compiléril independente este acela cd, daca | | ‘modificati codul unui fisier, nu este necesar s4 recompilati intreg programul | A Acesta economiseste o cantitate mare de timp, pentru toate programele, in afard | a de cole mai simple. Manualul de utilizare al compilatorulul C/C++ va contine instructiunile de compilare a fisierelor multiple. Utilizarea unui compilator de C++ pentru a compila programe in C Programele din Partea Intai a acestei cdirfi sunt programe in C. Totusi, probabil c& Pentru a le compila utilizaii un compilator de C++. Toate compilatoarele de C++ ‘sunt gi compilatoare de C, aga incat nu veti avea probleme, Insé, atunci cand compilati programe in C trebuie sa refineti un lucru important: figierele trebuie s& i} aiba extensia .C (nu CPP). In momentul scrierii acestei cari, majoritatea Compilatoarelor C++ comercializate compileaz automat figierele cu extensia .C ca if programe in C, iar fisierele cu extensia .CPP, ca programe in C++. (Unele Compilatoare pot sa utilizeze 0 conversie putin diferit8, aga incat verificati in : : ‘manualul dvs.) Chiar dacd C este continut in C++, exist& eateva diferente minore 5 Intre cele doud limbaje. Din acest motiv, trebuie s& compitatl programele in C ca programe in C, iat programele in G++, ca programe In C++. || Ih Gj cv: mont compat opto 2: exorest PE A 2st capitol prezintéelementete fundamental ale imbajuluiG (gi cesy: | | tip Domeniy minimel de valor expresille. Aga cum veti vedea, expresile in C sunt mult mai generale si mai puternice decat in alte limbaje de calcul. Expresiile sunt formate din clementele atom ale fimbajulul C: date si operatori, Datele pot fi reprezentate prin char 3 ela 127 ta 127 variable sau prin constante. Ca gi majortatea celoraitelimbaje, © acceptd mar ee ‘multe tipuri de date, De asemenea, el asigurl o mare varietate de operatort | | unsigned char 8 signed char 8 de la-127 fa 127 inci ti i ta) « la 32767 Cele cinci tipuri de date de baza |] int 16 de la 32767 | ir ‘ unsigned int 16 dela 0 la 65535, |i C exist® cinci tipuri de date de baz’: caracter, intreg, tn virguld mobil8, in coned mt ‘e Para Virgulé mobilé cu dubla precizie si far& nici o valoare (char, int, float, double $i ‘a Since fespectiv void). Dupa cum veti vedea, toate celelalte tipuri de date din C oe | short int 16 imitar eu i de date coy AcesteacincDimensiunea si domeniu de cupindere a acestor puri | unsigned shor int 6 de la 01a 65595 Siete bot Sf vareze tn funetie de tipul procesoruut ide modul de implementare || sencaner nt 16 Similar cu short int GyimbaluuiC. Dar. tn toate cazurio, un caracer ese reprezenal de unocel, | | eon 7 vie a-b 147 408.647 Gia ae mute on unre ocipd dol age nu puel 38 vl aceats cies Espundere dac& dori ca programul dvs. s& fie portabil In cele mai generale medi ee Este important s8 infelegetic& standardul ANSI stipuleasd dow’ dome ae signed long int 22 cole ihag cuprindere minimal a fecal tip de date, nu 51 marimea sa in octet, unsigned fong int 22 dela 0a 4.204 float 22 Sase zecimale exacte Xb, NOTA: Color cna tour de date definite nC, Cx+ adauga ino dows: boot | TM 84 Zece zecimale exacte siwehart. Acestea sunt discutate in Partea a Doua a cart a ne s ee Formatul exact al valorilor in virgulai mobité va depinde de modul tor de i inwroducere, Inegl vor corespunde in general mérimi normale a unui cuvant pe | caleulatorul respectiv. Valorite de tip char sunt n general uiizate pentru « | omen sunt tate gyn Caractere ASCII. Vote care ies din acest Tipul void dectar’ explicit 8 0 functie nu returneszd nici o vatoare sau creeaza domeniu sunt tratate in mod diferit de diferte compllatoare. imbele cazuri sunt discutate in capitolele urmatoare. mcs ral Ge cuprindere pentru floats! double va depinde de metoda folosta Ponte generci. Ambele cazus sunt discutate in capitolele urma Pentru a reprezenta numere in virguld mobil, Indiferent de melod%. domoniul sete. | foarte cuprinzator. Standardul ANSI-C speciticd domeniul minim pentru valor! In | virgulé mobilé de a 16-97 fa 1£+37 (de Ia 10°" la 10"). Numarul minim de cifte | et Tobelol 2-1) | Toate tipurile We date deninite prin Standardul ANS| Ol] Modificarea tipurilor de baza NOTA: Standardul Propus pentru ANSI C++ nu specific’ o marime sau 0 baz pentru a se adapta mai precis la situatii cat mai diverse. lata lista ‘Sennen iat’ Sry reenomsirgcavo Super sna Satisfacerea anumitor cerinfe. De exemplu, ef spune & int ,va avea | domeniul de-cuprindere normal pentru arhitectura sistemulul". Totusi, puteti signed figieru! antet marimea si domeniul de cuprindere al fipurilor de short bara. a. janval complet Puteti s& aplicati specificatorii signed, short si unsigned intregilor. Tipului de az caracter i se pot aplica signed si unsigned. De asemenea, puteti aplica long pentru double Tabelul 2-1 prezintd toate combinatille de tipuri de date care corespund standardulul ANSI C, impreund cu domeniile minimale si mirimea aproximativ in bifl. (Aceste valori se aplicd si unui C++ tipic.) Este permisd utilizarea lui signed pentru intregi, dar este redundanta, deoarece declararea implicit& ca intreg presupune un numar cu semn. Utilizarea cea mai importanté pentru signed este pentru a modifica tipul char in implementaiile in care acesta este, implicit, fara semn. | Diferenta dintre intregii cu si fara semn consta In modul in care este interpretat bitul cu ordinul cel mai mare. Daca specificati un tntreg cu semn, compilatorul Genereazé un cod care presupune c& bitul de ordinul cel mai mare va fi utilizat ca Indicator pentru semn, Dacd acesta este 0, numarul este pozitiv; daca este 1, | numérul este negativ. In general, numerele negative sunt reprezentate utilizand complementul tui 2, | care inverseazé toti bifii din numar (cu exceptia bitului de sem), adund 1 la acest ‘numér $i d& indicatorulut pentru semn valoarea + intregii cu semn sunt important in foarte multi algoritmi, dar ei ating doar jumatate din amplitudinea frajilor lor {8rd semn. De exemplu, iaté numdrul 32.767: ovititdt aaattitt Daca bitul cu ordinul cel mai mare este 1, nurndrul va fl interpretat ca -1. Dar daca il declarati pe acelasi ca un unsigned int, el devine 65.635 atunci cénd bitul respectiv are valoarea 1 Nume de identificatori In C/C++ numele variabiletor, ale functillor, ale etichetelor si ale altor diverse obiecte definite de catre ulilizator sunt numite identifcatori, Acesti identificatori pot 8 alb unul sau mai multe caractere. Primul caracter trebule s8 fie o literé sau 0 linie de subliniere, iar urmatoarele pot fi litere, cifre sau linia de subiinire. lat’ cteva nume de identificatori corecte si incorecte: Corect Incorect ‘numarator ‘Anumarator test23 salut! | bilant_mare bilant...mare | Standardul ANSI C stipuleaz& c& identificatorii pot avea orice lungime. Totusi, nu toate caracterele vor fi obligatoriu semnificative. Daca identificatorul este implicat intr-un proces de editare de legaturi externe, vor conta cel putin sase cone 2 rest FIR caractere. Acestiidentificaton, denumiti nume oxtere, includ numete functilor si ale variabilelorglobale care apartin mai multrfisiere, Dacd identficatorul nu este utiliza infr-un proces de editare de legatur din exterior, atunci vor fi semnificative eal pulin 31 de caractere. Acest tip de identifcator este denumit nume intern si include, de exemplu, nume de varistie locale. In G++ nu exista limite ale ungit tinuiidenificator si toate caracterele sunt semnificative. Aceastédiferenté poate fi importanié dacd dort si converiti un program din C in C++ Intr-ur identificator titerele mari sunt tratate distinct fafa de cele mici. Astfel, rnumara, Numara si NUMARA sunt tei identificator difent ‘Ata in C, cat gi In C++ un identificator nu poate fidentic cu un cuvant-chele si nu trebuie si alb& acelagi nume ca o functie cin biblioteca C sau C++ Variabile Dupa cum stiti probabil, 0 variabilé este numele unei locatil din memorie utilizate pentru a 28stra 0 valoare care poate {i modificata de program. Inainte de a le utiliza, variabilele trebuie declarate, Forma generald a unei declaratii este: tip list4_variabile; Ac tip trebuie si fie un tip de dat& valid, plus orice specificator de conversie, jar listd_variabile poate consta dintr-unul sau mai multe nume de identificator, separate prin virgulé, lat& cateva declaratii: ant i, i, 1s short int si; unsigned int ui; dousle bilant, profit, pierderes QQ ReTInerts in ++ numete variates nu are legit cu tut su Unde se declara variabilele Variabilele se deciar’, de obicei, in trei locuri: in interiorul functiilor, in cadrul definitiei parametrilor functiel $iin afara oricdrei functil. Avern, deci, de-a face cu variabile locale, parametri formall si variabile globale. Variabile locale Variabilele care sunt declarate 1n interiorul unei functi sunt numite variabile locale. © parte din literatura de C/C++ numeste aceste variabile variabile Bf co Man como automatice. Aceasta carte foloseste termenul mai uzual de ,variabile locale’, Variabilele locale nu sunt accesibile decat instructlunilor care sunt in interiorul blocului in care sunt dectarate variabilele, Cu alte cuvinte, variabilele locale sunt Cunoscute doar in interiorul propriului lor bloc de cod, Retineti c& un bloc de cod ‘incepe cu o acolada deschisa si se termina cu 0 acolada inchisa, Variabilete locale existé doar atét cat se execut blocul de cod in care sunt declarate. Aceasta inseamna cd o variabilé locald este creat la inceperea executiei blocului su si esto distrusd la incheiere, Biocul de cod co! mai uzual in care sunt deciarate variabilele locale este functia. De exemplu, s& lum urmatoarele dowd functi void funcl (void) t int x7 x= 10) ) void fune2 (void) { Ant x: x = -19! : Variabila intreaga x este dectaraté de doua ori, o dat4 in funct() si o data in func2(. x din tune) nu are nici o legaturd $i nici un efect asupra variabile! x din funca), deoarece fiecare x este cunoscut doar de codul din blocul in care este deciaraté variabila Limbajul C contine cuvantul cheie auto, pe care il puteti utiliza pentru a deciara variabile locale. Totusi, deoarece toate variabilele care nu sunt globale se Presupune ca sunt implicit auto, cuvantul nu este utilizat, in principiu, niciodats: De aceea, exemplele din aceastd carte nici nu il vor contine. (Se spune ci auto a fost introdus in C pentru a asigura compatibilitatoa ou pradeccoorul sau, D. Tot aga, auto este admis In C+ pentru a fi compatibil cu C.) Din motive de convenienta si traditie, majoritatea utilizatorilor declara toate variabilele folosite de o functie imediat dupa acolada deschis8 a functiei si inainte de orice alta instructiune. Totusi, puteti s& declarati variabile locale in orice bloc de cod. Blocul definit de o functie este pur gi simplu un caz particular. De exemplu: votd £ (vos a) int ty scanfi“td", eel Copitoll 2: expres JA char s{80]; /* aceasta este creata doar la intrarea in acest bloct/ ducets numele:"); printe ("int getsis); J*faceti ceva...4/ ’ Aici variabila locala s este creat la intrarea in blocul de cod if si distrusd fa legirea din el. Mai mult, s este cunoscutd doar in interiorul bloculul if si nu este accesibila din alt& parte - nici chiar din alte zone ale functiei care 0 contine, Un avantaj de @ declara o variabilé localé intr-un bloc de conditionare este ca, pentru acea variabila se va aloca memorie doar daca va fi necesar, deoarece variabilele locale nu existé pana cénd nu se ajunge {a blocul in care sunt declarate. Cu lipsa de memorie s-ar putea 4 va confruntati cAnd creati un cod pentru contfolul anumitor procese (precum deschiderea usii unui garaj care rspunde ia lun cod digital de siguranté) care dispun de foarte putin RAM, Deciararea de variatile in interiorul blocului care le utilizeaza ajutd, de asemenea, la prevenirea efectelor secundare nedorite, Atéta vreme cat cle au existé in afara biocului in care au fost declarate, ele nu pot fi modificate accidental, Existé 0 diferenja importantd intre modul de dectarare a variabilelor locale in C fai de C++. In C, trebuie s& declarati toate variabilele locale la inceputul blocului in care le definiti, inaints de orice instructiuni ale programulul. De exemplu, urmatoarea funcfie este gresit’ daca este compilaté cu un compilator de C. /* Koeasta functic este gresitadaca este compilata cu un compilator de C, dar perfect acceptabila pentru un compilator de cit " void £ (void) ( int 4; i= 10; int ji 3 = 20; fraceasta Linie va determina o exoare*/ 1 insi, in C++, aceasté funotie este perfect valabild deoarece pulteli defini variabite locale in orice ounct al programului. (Declararea de variabile in C++ este, discutata in profunzime in Partea a Dova a acestei crt.) Deoarece variabilele locale sunt create $i distruse la fiecare intrare, respectiv iegire din blocu! in care au fost declarate, continutul lor se pierde 0 data cu it 2 expest (I “+4: Manual complet pardsirea blocului. Acest lucru este important si ni-I amintim cand apelam 0 | functie, La apelaree ei, sunt create variabilele locale iar la Incheierea ei acestea sunt distruse, ceea ce inseamna c& variabilele locale nu p&streazé valorile intre apeteiri. (Totusi, puteti determina compilatorul s& pistreze aceste valor utilizand specificatorul de conversie static.) Daca nu se specific’ altel, variabilele locale sunt stocate in memoria stiva. Faptul c& memoria stiva este o regiune dinamiec& si in schimbare a memoriei | explic# de ce variabilele locale nu pot, in general, sd pastreze valorile intro functiei sau a i folosit in expres permise. Chiar daca aceste variablle primeso apelarie functit valoarea argumentelor transmise functiel, putts le folosil ca pe oricare ats Putetiniializa o variablé localé cu o valoare cunoscutd. Aceastd valoare van | Yaoarea argum ‘eh pute Nap atribuita variabilei de fiecare data cand se va intra In blocul de cod in care este ea declarat&. De exemplu, urmatorul program efigeaz numérul 10 de zece ori | Functia este_in() are dol parametri: s si c. Aceast functie returneazd 1 atunci cand caracterul specificat in ¢ este continut in sirul s; dacd nu, retueazé 0. Trebuie s& specificati tipul parametrilor formali declarandu-i aga cum am arta, poi puteti si ti folositi in interiorul functiei ca variabile locale obignuite. Retineti A, find variabile locale, ele sunt, de asemenea, dinamice $i sunt distruse la iesirea din functie, Ca $i pentru variabilele locale, pute{i s& atribuiti valori parametrilor formali ai Variabile globale Hinclude void #{vaid)? Spre deosetire de variabiele locale, variabiete glabale sunt cunoscute in introg void main (weid) Brogramul i pot fi ulizate de cBire orice zon8 a codulul. De asemenea, ele Ts: vor { astra valoa'ea pe parcursulintregl executi a programuiui. Variabilele globale se tnt is creeazi prin deciarare in afara orcdreifuncti.Orice expresie are acces la le. for(i=0; ito; an) £05 indiferent de tipul blocului de cod in care se aflé expresia, ) In urmétorul program variabila contor a fost deciaratd In afara oricdrel func pert Cchiar dacd declaratia sa se afd inainiea functei main(), al fi putut sd 0 plasati ( oriunde inainte de prima sa utlizare, dar nu inr-ofunctie. Este bine, tousi. si int 3 = 107 dectarati varabilele globale la inceputul programulu ee(red , 37 J*aceasta linie nu are nici un efect */ #include int cont: void fun /*contor este global */ void); a void fune2 void) Parametti formali |W voss setewweies Daca 0 functlo umeazds8 floseascd argumente, ca trobules& declare variabilele pe care le accept ca valori ale argumentelor. Aceste variabile sunt denumite t Parametri formali ai functiei. Ele se comport ca oricare alté variabild locala din conto a) 1001 acea functie. Aga cum se araté in urmatorul fragment de program, declararea lor are loc dup& numele functiei $I este inchisa Intre paranteze: funel (V7 /*Returneaza 1 daca c face parte din sirul s; daca nu, or/ | fy este_in(char *s, char c) void funcl (void) ( : ( while (ts) | inz temp: 4£(*seec) return 1; | tenp = contors else sth; | return 0; | fune2 (ds Eco Ment complet printf ("contor este td”, contor); /*va afisa 100 */ 1 void func? (void) 1 int contor; for(contor = 1; contor void Linte pe_spatiu(const char ‘sirl7 void main{voial “ ” Linte_pt_spatiu(acesta eate un test”) ’ wold Linie_pt_epativ(eonst char *str) 1 while(tste) “ag (tate | T)printe("te%, 1="17 else printf ("8e", ‘stzlz ster , bi inc srl 8 oat moaitat, ol nu ar Dect ase inept spat ast! net sc ti comtat Ds exemple uece ra sti cada ud cum urmeazt, ve timo treue in input compli Joncesta este un cod gresitt/ void Linde pt_spatiu(const char *ste) ‘ while (rete se(tsee /* nu pot face aceasta */ ) tote et

S-ar putea să vă placă și