You are on page 1of 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 a Printé(“8e", *str); Multe functii din biblioteca standard utilizeaz8 const in dectaratille for de Parametri. De exemplu, functia strlen() are urmatorul prototip: size_t strlen(const char *sir): Specificaind sir ca fiind 0 constant, el nu va modifica sirul indicat. In general, atunci cand o functie din biblioteca standard nu trebuie s& modifice un oblect Indicat de un argument de apelare, parametrul este declarat ca fiind constant, Puteti, de asemenea, sa ultlizali const pentru a veritica daca programul dvs. au modifica o variabila. Retineti cd o variabilé de tip const poate fi modificata de ceva din afara programului. De exemplu, un element din hard poate sa fi schimbe valoarea. Prin declararea unei variabile ca flind de tip const, pute(i dovedi cd orice modificare a acesteia are loc din cauze externe, volatile Modelatorul volatile spune compilatorului cd valoarea unei variabile poate sd fie modificata pe cai nedeclarate explicit de program. De exemplu, adresa unei variabile globale poate fl transmisé rutinei ceasului sistemului de operare si lwilizata pentru a pastra timpul real al sistemului, situatie in care continutul variabilei se moditicd fara o instructiune de atribuire explicita, Acest lucru este important deoarece majoritatea compilatoarelor de C/C++ optimizeaz’ automat anumite expresii pe baza presupuneril c& o variabila rimane neschimbata atat ip e@{ nu Se aia in partea stangd a unei instructiuni de atribuire, neflind astfel nevoie sa i se verifice continutul la fiecare utilizare, iar alte compilatoare modifica ordinea evaludrii unor expresii in timpul compiliii, Modelatorul volatile blocheaza aceste interventi, Pute{i utiliza const si volatile impreund, De exemplu, dacd 0x30 se presupune 8 este valoarea unui port care este modificatd doar de condii externe, urmatoarea declaratie va impiedica orice posibilitate de aparitie a efectelor secundare accidentale, opitolul 2: Expres Specificatori de clase de stocare admite par specificatori de clase de stocare: chezs varlablle caret Acest speciticatori spun compilatorulu cum 58 st uemoeia, SpecttoatoralGo stocare precede resul ecaratiel de variable, Forma sa generalfeste specificator de_stocare tip sume_variab extern rece C++ perm secur separate ale unui progam mares fe cimpltendpendent ase eecetepure impound, rebuie s e0 un sod ds comune wre eri varablele loblenecesare program. Oe Cert practic declrorea une vaiabie goose de ai mute ou ee b axe oct eats cea probie aeareaegstrien, ma pera est fall fine ute ecara oval bal da” oda Cum ve forma sn: ote ieee an poam despre vale ital ulate? Sole os Sk celrl late vale lta ran snr ier 39 lst o™rigerd ta ce vara gbae fst copia in inl tr delratior lea Yas eddugat specitcatoul extern, Acestaspune compiatoruuic8tipure§ Figen 2 exten int xy: exter char ch; tunez2(voia) Fgier 1 int xy; char ch; main(void) 4 y funct() « 23; } BBE cot Manvel compiet furele de variate care i umeaza extern ofer compiltorul informatie Se m ile despre numete tip do van global fd 58 creze de opt un nu oc de slocae alr. Alun! ind ent cate lor doua sectiun, este rezolvat si accesul la varlabilele externe | au fost declarate in altd parte. Cu alte guna] ‘Cuvaintul cheie extern are forma generali extern lista variab; Mai existé gio alt ullzare optional tional pentru extern pe care o vel intaini uneor Ana folositio varabid globalé in intriorul une funeti pute bo decane ind de tip extern, aga cum este aritat ai: . eaten int primul, ultimul; /* definirea penteu primului si ee ultimului ca variabile globale +/ ‘ extern int primul; /* ucilizarea*optionala a declaratie! extern */ ssp ei eae ere nc at sta acesta,Dacd nv intnest, com i ‘ . compilatru veried variable global. Ba idineste una, el presupuno e8 rebut uliizoze varaole ape Variabile statice Ree 8 tp ae ues Permanente in interiorul functiei sau | 0 alsose. Spre deosebire de varsbiee geval cunoscute in afara functiei sau fisierului, dar ele eenuncgas ee ull, dar el pastreara vel ells Aceast caracteticd este ull cna serie tneli goneraieare nase de bibctec pe care fo pa tien a Variabieior locale i asupracelorglobaie, nT we etete ene esupra Variabile locale statice Atunci cand aplicati specificatorul st static unei variabile local i pean it teat pect arlabile locale, compilatorul creeazé lent&, similar celui rezervat unei variabile ee Copitolul 2: Expres globale. Diferenta esentialé intre variabilele locale statice gi o variabilé global este cf cea locald static rSmane cunoscut doar bioculul in care a fost declarata Mai simplu, 0 variabilé lovald static’ este o variabild locald care isi pastreaz’ valoarea intre apelarile functiei Variabilele locale de tia static sunt foarte importante pentru crearea unor functii de sine stétdtoare, deoarece mai multe tipuri de rutine trebuie s& pastreze valori intre apelri. Dacd variabilele statice nu ar fi fost permise, ar fi fost utilizate variabile globale, riscdndu-se ins aparitia efectelor secundare. Un exemplu de funclie care beneficiaza ce variabile locale statice este un generator de serii de numere care emite o valcare in funotie de cea precedentd. Ati putea folosi variabile globale pentru a rejine aceasta valoare, dar de flecare dat& cand functia ‘este utilizatd Tntr-un program, ar trebui s deciarali acea variabilA si sd va convingeti cd nu va intra in conflict cu alt& variabild global deja dectarat. De asemenea, utilizarea unei variabile globale ar face aceasta functie greu de introdus jntr-0 funciie de bibliotecS. Cea mai bund solutie este s8 declarati variabila care plstreaz’ numarul generat ca static, ca in urmatorul fragment de program: sexti i (voia static int serii_nums sersi_num = seril_num+23; return seril_num: 1 In acest exemplu, varabila serii_num continu’ s& existe intre apelérite functiet ‘sinu apare gi dispare asa cum o fac variabilele locale obignuite. Aceasta inseamind cd fiecare apelare a funcjel seriif) produce un nou numar al seriei bazat pe precedentul, fard s& declare acea variabild ca fiind globala. Variabilel locale de tip static puteti sd Ti dati o vatoare initial. Aceasta valoare teste atribuitd 0 singurd data - qu de fiecare dat cAnd se intrd in blocul de cod -, a $i in cazul variabilelor locale obignuite. De exemplu, aceasta versiune pentru serii()initializeaz3 serii_num cu 100: serii(voia) ‘ static int serii_num = 100 serid_num = serii_numt23; , ‘Asa cum araté funotie acum, seriile vor incepe Intotdeauna cu valoarea 123, Dacé lucrul este acceptabil pentru unele aplicatii, majoritatea generatoarelor de Ce | Seri neces speciicarea de fire utlizator a nundrull ina. © eale de a da varie seriou ovata spect de uaa ese de 0 dos varabl alba apo ca values specicls, Dar vet sess am drt Evitdm clue! cin am docarato stated. Acbasta ne conduce la coals 4 specificatorului static. a Variabile globale statice Aplicand speciiatorl static uneivarlabileglovae, vom spune compllatoruul $8 ereeze 0 vanabilé global care esto cunoscuté Goat ih fisieru Tn care fost Geclarata, Aceasta Inseam of, desi varabia ete global, rutinele dn ate fire ‘nu au acces le ea si nu Ti pot modifica direct continutul, ea fiind astfel protejatd de | efecto secundare, Pentru putrele situa pentu care o vaabltceld stated hs Convine, pul een un mie er care cnine doar fucta care are naval de Yatabla Global i stati po cae si compl spear abs ea Penta a usta oastel de varlabils, exemplu de gonerator de numere din sectunea precedent a fost reser, ase Incl valore primard 6d Inilizoze Seria printr-o apelare a unei functii numite incep_serie. In continuare este prezentat ttre itera care contine seri), nee. serie) ae J+ Toate acestes crebuie sa fie intr-un singur fisier. * static int serii_num; pened void Incep_serieTint initial); ine serii (Wea), serif (void) i serii_num = serii_numt23; returs serii num /* anatializeaza serii_num */ void incep_serie(int incep) ‘ serii_num = incep; ) Inioducdnd tn incep_serie 0 veloae inreags se inializeaz seri, Dupi aceasta se apeleer4 seri penta genes uml elena sete 8 rocaptudm: numelevarabieir locale dep state um cunozeate aos, blocutlor de cod n care sum decirate; numele vaibletor global dtp static sunt cunoscute doar figierului in care se gasesc. Dacd introduceti funcfiile serii() si nt_serie) intro oblotecd, putt ula funcile dar nu vel avea acces tm copie : ret [FB variabila serii_num care este ascunsd restulul codului din program. De fapt, puteti chiar s8 declarati i s8 utilizati o alt8 variabila numita serii_num in programul dvs. (desigur, in alt fisier). In esentd, specificatorul static permite existenta unor variable cunoscute doar functilor care le neces, fir s& intre in conflict cu alte functi. Variabiele de tip static va permit s@ ascundeti anumite sectiuni ale programului fat8 de altale, Acesta poate fi un avantaj imens atunci cénd incercatt 8 gestionati un program mare si complex. Variabile de tip register Specificatorul de stocare register se aplic’ prin traditie doar variabilelor de tip int si char, Totusi standardul ANSI C Ti dé definitia, astfel incat puteti s8-1 folositi pentru oricare tip de variabil’ Initial, register cerea compilatorulul s& pastreze valoarea unei variabile intr-un registru din CPU si nu in memorie, acolo unde sunt stocate variabilele in mod normal. Aceasta inseamné cf operatile asupra unei variabile specificate cu register, pastrate in CPU, sunt executate mai ropede decat asupra uneia obisnuite deoarece nu necesita acces la memorie pentru a determina sau a modifica valoarea ei ‘Acum definitia specificatorului register a fost mult extinsa si el poate fi aplicat oricdrui tip de variabild. Standardul ANSI C dectard simplu ca .accesul la obiect ‘este ct mai rapid posibil’, (Standardul ANSI C++ stipuleaz& ca register este .0 indicatie data compilatorului, c4 obiectul astfel declarat va fi utiizat din plin.") In practicdi, caracterele $I intregii sunt in continuare stocati in registre ale CPU. Obiecteie mari, cum Sunt mnatricele, evident nu pot fi stocate intr-un registru, dar cele pot tolugi $4 beneticieze de un tratament preferential din partea compilatorulul Variabilel2 register pot fi tratate difert, astfel incat s& corespund’ modului de instalare a compilatorului de C/C++ gi mediului sau de operare. De fapt, tehnic este permis unui compllator s& ignore register si sd trateze normal variabilele specificate, dar aceasta se intampla rareoti in practic&. Puteti s8 aplicati specificatorul register doar variabilelor locale gi parametrilor formali ai unei functii, Asadar, nu sunt permise variabile globale de tip register. lat& un exemplu care foloseste variabile register. Aceast& functie calculeaz’ rezultatul lui M® pentru valor intregi. putere_int (register int m, register int e) f register int temp; temp = 1. For(s e7 return temp; e--) temp = temp * mi = c++: Manvol complet in acest exemplu, e, m-si ter Ip sunt declarat deoarece sunt toate utitzate intro bucla. Faplulc8 variable reatete alee ca viteza le face ideale pentru controlul sau utilizarea in bucle. in icdte variabile ca find de tip register, dar n vor 7 optimizare a vitezei de acces. ® “toate cua inualul compil ‘ului pentru a afla daca putefi sa aplicati si i Sea puteti iplicati si alte tipuri de opfiuni aa iar daca standardul ANSI C (Si cel propus pentru ANSI C++) a largit ° Initializari de variabile Pte 8 introducetiovaloare into i a aloare Into variabilB in momenta dectardri prin pas dupa numele variabilei a semnului egal si a unei constante. Porn nts initializarii este: Guaeanaaece variab = constanta; lat catova exemple: char ch = ‘at; int prima = 0; float bilant = 123.23; Variabitele globate si cele statice locale sunt inifializate doar la inceputul programulul. Variabilele locale (in afara color de tip static) sunt infializate de Copitolul 2: éxpresit 57 fiecare dat& c&nd este intflnit blocul in care sunt declarate. Variabilele locale caré ru sunt initilizate au valori necunoscute Inainte de prima atribuire pe care le-o efectuati. Variabilele globale si locale de tip static neinitializate sunt automat iniValizate cu 0 Constante Constantefo se referd la valori fixe pe care programul nu poate sé le modifice. Gonstantele pot fi de oricare din tipurile tundamentale de date. Modul in care este reprezentata fiecare constant depinde de tipul sau. Constantele de tip caracter sunt incluse intre ghilime e simple. De exemplu, ‘a "gi %’ sunt ambele constante de tip caracter, G defineste, de asemenea, caractere multioctet (mai ales in mediile care nu utilizeaz® limba engleza.) Constantele de tip intreg sunt specificate ca numere f&ra parte fractionar’. Oe exemplu, 10 si -100 sunt constante de tip intreg. Constantele in virguld mobila cer punctul zecimal urmat de partea zecimala a numérului. De exemplu, 11.123 este o constanta in virgul’ mobil’. C permite, de asemenea, utilizarea notatiel stintifice pentru numere fn virgulé mobila ° Exist doud tipuri de numere in virguld mobil: float si double. Exist’, de asemenea, mai multe va‘iet3ti ale tipurilor de baz pe care le puteti obtine utilizand specificatorii de tip. Implicit, compitatorul C stabileste pentru 0 constant’ numeric cel mal scurt tis de date compatibil care o poate pastra, De aceea, 10, este implicit int, dar 60,000 este unsigned, iar 100.000 este long. Chiar dacd valoarea 10 poate intra 11 tipul char, compilatorul nu va transgresa limitele tipulul Singurele exceptii de la regula tipului celui mai scurt suat constantele in virgula mobil, care sunt asimilate tipului double. Compilatorul are set implicite adecvate pentru majoritatea programelor pe care le veli serie, Totusi, puteti si speciticati explicit tipul de constant numerica pe care o doritiulilizandun sufix, Pentru tipul in virgula mobild, dac& veti scrie un F in urma sa, numérul va fi tratal ca flind float. Daca va fi urmat de L, numéirul va deveni long double, Pentru tipul Intreg, pentru unsigned vei folosi sufixul U, iar pentru fong, sufixul L. latd cateva exemple: Tip de dots Exemple de constant int 4, 123, 21000, -234 long int 350001, -34L short int 40, -1280 unsigned int 10000U, 987U, 40000 float 123.23F, 4.340-3F double 123.23, 12312333, -0.987624 Jong double 4001.2 TEBE! c++: manval complet Constante hexazecimale si octale Uneori este mai usor sa folosifi un sistem de numeratie in baza 8 sau 16 tn loc de 10 (sistemul nostru zecimal standard). Sistemul de numeratie bazat pe 8 este ‘fumit octal $i utilizeaz8 cifre de la 0 ta 7, In octal, numarul 10 reprezinta 8 tn Zecimal. Sistemul de numeratie in baza 16 este numit hexazecimal gi utilizeaz’ Cifrele de la 0 la 9 plus literele de la A la F, care {in locul elementelor 10, 11. 12, 13, 14 gi respectiv 15. De exemplu, numarul hexazecimal 10 este 16 In zecimal. Deoarece cele doud sisteme de numerajie sunt deseori intrebuintate, C va permite 8 specificati constantele intregi in hexazecimal sau octal in loc de zecimal, O Constant’ hexazecimald consta din Ox urmat de constanta in forma zecimala. Constanta octald incepe cu 0. lata cateva exemple: int hex = 0x80; int oct = 012; /* 128 in zecimal */ /* 10 in zecimal */ Constante de tip sir C admite $i un alt tip de constanta: girul. Un gir este un set de caractere inchise intre ghilimele duble. De exemplu, ‘acesta este un test” este un sir, Ati vizut exemple de siruri in unele din instructiunile printf() din pragramele exemplu, Chiat daca C va permite s& definiti o constants de tip sir, nu existd efectiv un tip de date de tip sir. Nu trebuie si confundati sirurle cu caracterele. © singurd constantd de tip char este alcétuité dintr-un singur caracter si incadrata intre apostrofuri, ca de exemplu ‘a’, Dar, “a” este un sir care contine doar o singurd liter’, Constante de tip backslash caracter Incadrarea constantelor de tip caracter intre ghilimele simple lucreay™ pentru ‘majoritatea caracterelor afigabile. Insd altele, putine la numér, cum ar f caracterul de Tinie noua, sunt imposibil de introdus de la tastaturd. Din acest moti, C Include Constante speciale backslash caracter. C admite mai multe coduri backslash speciale (prezentate in Tabelul 2-2) astfel ‘neat sa puteti introduce ugor caracterele respective ca pe nigte constante. Pentru a asigura portabilitatea trebuie sd folosifi codurile backslash in focul codurilor lor ASCII, De exemplu, urmatorul program emite © noua linie gi un spatiu de tabulare si apol afigeazd sirul Acesta este un test. Hinclude void main(vosd) codut Semaiticayia \b Backspace } ov ‘vans hate | ow Rand nou } Retur de car w ‘Spatiu de tabulare orizontat v Ghilimete duble y Ghilimele simple 0 Nul v Backslash (linie incinata spre stanga) w ‘Spatiu de tabulare vertical @ Alera Ww Constanta in octal (unde N este constanta in octal) uN Constanta in hexazecimal (unde N este o constant’ in hexazecimal) printé(*\n\tacesta este un test); Operatori estora 0 important mai mare contine foarte multi operator. De fap, el acardA acest 0 Gecdt majertates limbajelor. C defineste patru clase de operator: svtinetie, relational, logic gi de aofiune pe biti. Pentru anumite sarcini C are op suplimentar. Operaterul de atribuire in code oid expres vais, ers ©, pute 8 cost operator do ature neal orca expe Carnes perm ejnaten Imo de prearamare incl Pasa GASIG si FORTRAN), coe tateazd operator Ge ati cape un caz de ietructune special Forma generis operstorl Ge atabuie este ‘nume_variabild = expresie; EH] c+: manual complet unde 0 expresie poate fi o constant& simpla sau atat de complexa pe cat va este necesar. Ca si BASIC sau FORTRAN, C utllizeaz un singur semn egal pentru a indica atribuirea (spre deosebire de Pascal sau Modula2, care ulilizeaz’i constructia :=). Tinta, sau membrul stang al atribuiri, trebuie sa fie o variabilS sau un pointer, nu o functie sau 0 constanta: Frecvent, in literatura despre C si in mesajele de eroare ale compilatorului vei observa acesti doi tormeni: Ivalue si rvalue. Exprimat simplu, Ivalue este orice obiect care poate si apard in partea din stange a instructiunil de atribuire. In racticd, in toate situafille, value" insearnnd .variabila”, Termenul rvalue se refer’ la expresiile din membrul drept al atribuiri si, pur si simplu, ea contine valoarea unei expresii Conversii de tip la atribuire Cnd variabilele de un anumit tip sunt amestecate cu variabile de alt tip, are loc 0 Conversie de tip. intr-0 instructiune de atribuire, regula de conversie este usoard: valoarea din membrul drept (cel al expresiei) al declaratiei de atribuire este Convertt& fn tipul din membrul stang (variabila tint8), aga cum se ilustreaz tn continuare: char ch; Flo void fune (void) t che x; /#linia 1*/ x /linia 24/ Esch; /*linta 3*/ fax Ptinia 4+/ ' In linia 4, biti de ordin mare din sténga ai variabilei tntregi x sunt eliminati, rémanand pentru ch cei opt biti de ordin mic, Dacd x este cuprins intre 256 $!°0, ch 41 x vor avea valor identice. Altfel, valoarea din ch va reflecta doar bili de ordin ‘mic ai lui x, In linia 2, x va primi partea nefractionard a lui. In linia 3, f va convert valoarea intreaga de 6 biti din ch In acoeasi valoare, dar in format de virguld mobil8. Acelasi lucru se intampld si In linia 4, doar c& f va convertio valoare intreaga in format de virgulé mobil. Cand convertim din intregi in caractere si din intregi lungi in intregi, se iniéturd cantitatea corespunzatoare de biti de ordin superior, in multe medii, aceasta inseamni cd se vor pierde 8 biti atunci cénd vom trece de la un intreg la un caracter si 16 cand se va trece de Ia un intveg lung la un intreg | | | | cept 2 ret EE is desinait Tl esgesel_—_ ose pada de norma Sonesta Ghar bach votes >127, desta este cout it cima somneat 0 i or tri Ge mel emia 2¢ de [Feuelul 25) Typud de conversie des felpsite (oresupunand cuvinte de 16 bi Tabelul 2-8 ezum8 spocificatori de tip pentru arbuie, Retinei cl prin converse int in float, su float n double 9 aga mai depare, nu se casts precile sau exacttate, Aces tip de specitietor schimba doar forma de Teprezentare@ valor. in plus, unele compiatoare (S| procescare) C,intoldeaun: Gand fac conversiaunei variable do tip char Tn int sau float, o rateaz8 ca fn Poxiva,naerent de valnarea contin in a. Ate compilatoare, atunci cand Convertese variable de tip char, treteazd valorile mai mari decat 127 ca m rs negative, in general, puteti sd folositi variabile de tip char pentru cara: ikeay int short ine seu signed char atunc! cand Jail s& evita problemele de Sra jertiti pe rand, ela un tip Ia alu, panda stg. De exemp, petra a face conversa double in int, mal intai convert double in float gi apo! din float in int. Atribuiri multiple i multor variable prin atiizrea va pormite saul access vatoare mal mul eae Satartmutpte nto cngurdnstvctune de aoure De exempt, acest fragment do program atte valoare Ox, y $12 Hee» in programele profesionale, aceast® metodi este des utilizat’ pentru a atribui variabilelor valori uzuale, 207 [BB c+: mont complet Operatori aritmetici Tabelul 2-4 prezinta operatorl aritmetici din C. In C, operatorii+, -,* si/ lucreazé la fel ca in majoritatea altor limbaje. Puteti s& fi aplicatl oric&ror tipuri de date ermise in C. Cand aplicafi / unui intreg sau unui caracter, orice rest va fi eliminat, De exemplu, 5/2 va fi egal cu 2 pentru o Impartire intreaga. Operatorul modulo, %, lucreaza in C ca si In alte limbaje, retinand restul unei impartiri de intregi. Nu se poate folosi pentru valori In virguld mobil, Urmatorul fragment de cod prezinta utilizarea lui % printiivéd", x/yl; /* va afisa 2 */ printé("sd", xty); /* va afisa 1, restul impartirii de intregi */ xeay y= 2s printf ("td Sa", x/y, xtyl; /* va afisa 0.1 */ Litima linie afigeaz8 un 0 si un 1 deoarece 1/2 Intr-o impartire de intregi este 0, cou restul 1 Minusul unar inmulteste elementul cu -1, deoarece orice numar precedat de un ‘semn minus isi schimba semnul Operator fine : Seddere, de asomenea $i minus unar : ‘Adunare . Tnmuttire ' impacive | % Hodul | - Decrementare j x feamese | | abel 88) Operator aimee ly ao as conti: peat Increment si decrement C include doi operator utili care nu se gasesc in general in alte limbaje. Ei sunt ‘operatorii de incrementare si de decrementare, ++ si. Operatorul ++ adund 1 la variabila operata lar -- scade 1. Cu alte cuvinte: este acelasi lucru cu: wey este acelasi lucru cu’ ‘Atat operatorii de incrementare c&t si cel de decrementare pot si fie plasati inainte sau dup’ variabila operat. De exemplu, i poate fi sais sau Existd totusi o diferenta intre forma cu prefix si cea cu sufix cand utilizati acesti operatori intr-o expresie, Atuncl cand operatorul de incrementare sau de decrementare precede variabila, C efectueaza operatile respective inainte de a obfine valoarea variabilei pontru a fl ulilizatd in expresie. Daca operatorul urmeazd variabilei, C objine valoarea variabilei inainte de incrementare sau de decrementare. De exemplu, x= 10; ye Hx HL cv+: anv compet atribuie valoarea 11 Iui y. Daca veti scrle codul astfel lui y Ise va atribui 10. In ambele moduri, lui x i se atribuie vatoarea 11; diferenta const in. momentul efectuaril operat. Majoritatea compilatoarelor C/C++ produc rapid un cod oblect eficient pentru operatille de incrementare si de decrementare - cod care este mai bun decat cel obtinut prin utlizarea instructiunii de atribuire echivatente. Din acest motiv, ar trebui s& utilizati acesti operatori de cate ori putet. lala ordinea de precedent a operatorilor aritmetic: De ordinul cel mai tnalt + = (minus unar) “1% De ordinut cel mai coborit + Operatorii cu aceeasi precedenta sunt evaluati de compilator de Ia sténga la Greapta, Desigur, puteti s& utilizati paranteze pentru a modifica ordinea execuliei C trateaza parantezele la fel cum le trateaza si toate celelalte limbaje. Ele forteaza a 0 operatie sau un set de operalii S8 iba un nivel de precedent mai inalt. Operatori relationali si logic! in termenul ,operator relational’, relational se referi la relalile pe care aceste valori pot sé le aiba cu altele. in termenul .operatar logic’, logic se referd la modul in care sunt corelate aceste relafi. Deoarece operatoril relationali gi cei logici lucreaza de obicei tmpreund, ei sunt discutati gi aici tot impreund Operatorii relationali si cei logici se bazeazd pe ideea de adevarat si fals. In C, adevirat este orice valoare care diferd de 0. Fala este 0. Expresiile care ulilizeard operatori relationali $i logici retumeaza 0 penteu fals si 1 pentru adevirat. ‘Tabelul 2-5 prezint& acesti operatori, Tabela de adevar a operatorilor logici utilizeazé 0 gi 1 ° 9 paaq eta e ° 3 ° ° 1 ° 1 ° 1 1 1 4 1 1 ° 1 ° ° 1 ° Atat operatoriirelationali cAt gi cei logici au o precedent mai scdzut8 decat cei aritmetici. Aceasta inseamnd cd 0 expresie ca 10>1#12 este evaluat ca si cum ar opitolul 2: Expres [39 Aciune Mai mare decat Mai mare sau egal Mai mic decat Mal mic sau egal Egal Diferit Operato og Operator atone 8a AND ($1). t OR (GAN) 1 NOT (NEGAT) (Foeewsiopeiatori reational shies fifost scris® 10>(1#12). Dasigur, rezultatul este fais. Sugd cum voce ples sf combinall ma mule operat into expres: LO>661 (20<9) | 13¢4 2, rezultatl este adevlcat Char doc i'n C= nu conn oporsort gle SAU exlusiv OR) putl a reat foarte wor func cates execute acast sercind, ulzand Bata apes ig caroocf. Reza une oprati KOR este eval doch Sr umnl ach an lement (ena ambi este adevrat, Ute prooram co fina nor) coe retumeaed rezlatl une! operaicu SAU exciusi oper aupracelor dous argument propri finclude int xor(int a, int bl; main (void) peinee("ad", Brunee (tan, printetved", eure, xox (0, TE oe: manu complet /* efectuarea unei operatii HOR utilizand cele doua argumente. */ xor(int a, int b) { return (a || b) e& !(a @& BI; ) Urmatorul tabel arata prioritiile relative pentru operatorii relationali gi cei logici De ordinul cot mai inalt ! aa De ordinul cel mat coborit i Ca si in expresiile aritmetice, putefi utiliza parantezele pentru a modifica ordinee fireasca de evaluare a unei expresil relafionale si/sau logice, De exemplu, roseoi10 este fals. Dar dac& addugati paranteze acestel expresil, aga cum vedeti mai jos, rezultatul este adevirat §(0«60) 110 Relineti cd toate expresiile relationale si fogice au ca rezultat 0 sau 1. De aceea, urmatorul fragment de program este corect si va afiga cifra 1 x = 100; PEint£("4d”, x>10) 2 Operatori de actiune pe biti ‘Spre deosebire de multe alte limbaje, C admite un complement deplin cu operatori cu actiune pe biti. Deoarece C a fost proiectat s4 ia locul limbajului de asamblare pentru majoritatea sarcinilor, el trebuie sa fie capabil sd asigure multe operatii care Pot fi executate in asamblor, inclusiv operatil asupra bitilor. Operafife asupra bifilor So roferd la testare, inifializare sau deplasare a bitlor existent Intr-un octet sau intr-un cuvant care corespunde tipurilor de date char 5! int si variantelor acestora din standardul de C. Nu puteti le utilizati asupra tipurilor float, double, long | Copitolul 2: €xpres double, void sau asupra altor tipuri mai complexe. Tabelul 2-6 prezint operatorit care se aplica bililor individuall ai variabilelor. ‘Operatorii pentru biti AND, OR si NOT (complement) au aceleasi tabele de ‘adevar ca si echivalentele lor logice, doar cf ei lucreaza bit cu bit. SAU exclusiv ‘are urmatoarea tabeld de adevar: e q pq 0 0 0 1 ° 1 1 1 o 0 1 f ‘Aga cum arata tabelul, rezultatul operatiei XOR este adevarat dacd numai unul dintre termeni este adevarat; altfel, el este fals. ‘Operalile cu biti isi glsesc adesea aplicatit in cadrul driverelor de dispozitiv - ‘asa cum sunt programele pentru modem, rutinele fisierelor de pe disc si rutinele de tipacre - deoarece pot fi utlizate pentru a descoperi anumiti bit, aga cum este cel de paritate. (Bitul de paritate confirma c& ceilalti biti din ace! octet sunt nemodificatl. El este de obice’ bitul cu cet mai mare ordin al fiecdrui octet.) ‘Gandifi operatorul pentru bili AND ca un mod de a curdta un bit. Aceasta inseamna cd orice bit care este O intr-unul din termeni determing bitul corespunzator al rezultatulul si fie 0. De exemplu, urmatoarea functie citeste un Caracter dia portul mademului utlzand functia citeste_modem() si reinitializeazd bitul de paritate la 0. char preia_char_din_nodem(void) chs ch = citeste modem(}; /* preia un caracter din portul modemului */ 7 nape & AND I OR . OR exetsiv KOR) - Complement ft de 4 (NOT) oe 7 Deplasare la dreapta_ « Deplasare la sténga ecco Eee Bf BB cos: anv compet retuen(ch 6 12713 ) Paritatea este deseoriindicatd de col de-al optulea bit, care este initializat cu 0, rin operatia AND cu un octet care are primi 7 biti inilalizati cu 1 iar bitul 8 cu 0. Expresia ch & 127 inseamné ca bitii din ch sunt combinati prin operatorul AND cu cel care formeaza numarul 127. Rezultatul efectiv este acela c& al optulea bit din ch capita valoarea 0. In urmatorul exemplu, se presupune ca ch a primit caracterul A si c& are $i bitul de paritate stabilit la 1 Bit de paritate 4 11000001, ch contine un ,A* cu bit de paritate onnatttt 427 in binar & —— AND asupra bitilor 1000001 A" fard bit de paritate Operatorul pentru biti OR, ca opus al lui AND, poate fi utilizat pentru a atribui unui bit valoarea 1. Orice bit initializat cu 1 in orice termen determina ca bitul corespunzator al rezultatului sd fie 1. Urmatorul exemplu reprezinta 126 | 3. 40000000 128 in binar 0000011 31a binar t= OR asupra bitilor 10000011 rezultat Un OR exclusiv, prescurtat uzual cu XOR, va inifializa un bit daca gi numai daca bitii pe care ii compara sunt diferit. De exemplu, 127°120 este: onan 127 in binar 01111000 120 in binar _—— XOR in logica bitilor 0000111 rezultat GQ. RETINET!: operator celatonal $i co logic determina intotdeauna un rezultat care este 0 sau 1, in timp ce operatoril similarl pentru biti determing © valoare arbitrara in concordan{é cu operafia respectiva. Cu alte cuvinte, operatile pentru biti pot s& duct la alte valori decat 0 $i 1, in timp ce ‘operatorif logici evalueaz’ intotdeauna la 0 sau 1. Operatorii de deplasare pentru biti, >> si <<, deplaseazd tol biti dintr-o Copitolul 2: Expres variabitd la dreapta sau Ia stnga dup& cum se specific. Forma generalai a Instructiunii de deplasare la dreapta este: variabila>>numeir de pozitil ale bifllor Forma generaléi a instructiuaii pentru deplasarea la stanga este: variabiltic void main (void) i unsigned int iy dat peu (+ depiasare la at/ for(jeo; Jas J++) [ fei > 1; /* deplasare la dreapta a lui 4 cu 1, Care este acelasi lucr ee FEB + ont complet impartirea cu 2 */ ‘deplasare la dreapta td: d\n", printé Operatorul de complement al lui 1, ~, inverseaza valoarea fiecdrui bit dintr-un octet. Cu alte cuvinte, 1 este transformat in 0 far 0 Tn 1 Operatorii pentru biti sunt deseori utlizati in rutine criptate, Dacd doriti ca un fisier de pe disc s8 fie iizibil, efectuati asupra lui céteva operalii cu biti, Una dintre cele mai simple metode este cea de complementare a fiecdrui octet utilizand complementul lui 1, care inverseaza fiecare bit al octetului, asa cum se prezint’ mai jos: Octetul original Dupa prima complementare Dupa a doua complementare (00101100 +. oe 14010011 = Acelasi aototieg Notati ca o secventé de doud complementiiri succesive produce numérul original. Astfel, primul complement reprezinta versiunea codificata a acelui octet, Al doilea complement decodeaza octetul la valoarea sa original Pentru a codifica un caracter pute folosi functia encode() unsigned char x x dupé executarea fiecdrei voloorea lui x instrucivni ooooorst 7 00001110 4 04110000 112 11000000 102 at100000 96 00011000 24 Fiecare deplasare la stanga determing o inmuitire cu 2 Remarcaji cd s-a pierdut informatie dupa x void main(void) int tinta, sursaz eursa = 10; tinta = *m printf ("ed”, tinta); Operatorul din timpul compilarii, sizeof i i caro rotumneazs lungimen sizeof este un operator unarutilizat fa timp compl . in octet. a variable! sac a specificatorului Oe tip dint paranteze care fi urmeaz8, De exemplu, presupunénd o8 intregi au 2 octet! ar tipul float are 8, float £; print£("td “, sizeof £1; printf ("sd ", sizeof (int) va afiga 8 2. tina Retinol 8 pentru a calcula mérimea (size) unui tip, trebule 8 includelinumele tipului intre paranteze, Acest lucru nu este necesar pentru numete de variabile, esi nu este gresit. core ‘C defineste (utilizand typedef) un tip spectat numit size_t, care corespunde TBR v4: mont compat aproximativ unui intreg fra semn. Practic, valoarea returnata de sizeof este de tipul size_t. In practicd ins, puteti si considerati (si s& il utlizati) ca si cum ar fi © valoare Intreaga far sema, in primul rand sizeof ne ajutd s8 crem un cod portabil care depinde de marimea tipurilor de date construite fn C. De exemplu, imaginati-va un program de baze de date care necesita s& stocheze gase valor! intregi in fiecare inregistrare, Dacé dori sd utilizati acest program de baze de date pe o diversitate de calculatoare, nu puteli stabili dvs. mArimea unui intreg, ci trebuie s& determinati marimea sa efectiva utilizand sizeof. Aga stand lucrurile, afi putea folosi urmatoarea rutin pentru a serie o fnregistrare intr-un fisier pe disc. / *scrieti 6 intregi inte-un fisier pe disc. */ void preia_inreglint inreg(6], FILE *f { int lung; lung = fwrite(inreg, sizeof inreg, 1, fp): if(lung != 1) printf ("eroare de serieze”); ) ‘Aga cum este scris, preia_inreg este compilat si rulat corect pe orice calculator, indiferent de numarul de octet! continutiintr-un intreg. Pentru a incheia, sizeof este evaluatd in momentul compilirii, iar valoarea pe care o determina este trataté ca o constant’ in cadrul programului dvs. Operatorul virgulé Cperatorul virguid asiguré insiruirea mai multor expresii, Partea din sténga operatorului viqqulii este intotdeauna evaluaté ca void. Aceasta inseamnd c& expresia din dreapta stabileste valoarea Intregii expresii separate prin virgull. De exemplu, Boe = ors, ya in primut rand atribuie lui y valoarea 3 si apoi atribuie lui x valoarea 4. Parantezele sunt necesare deoarece operatorul virguld nu are prioritate fata de operatorul de atribuire. in principal, virgula stabileste 0 succesiune de operatil. Atunci cAnd o utilizati ia partea dreaptd a instructiunii de atribuire, valoarea atribuitd este cea a ultimei ‘expresii din lista separatd prin virgule. Operatorul virguid are ceva din Infelesul cuvantului si" din limba vorbita, aga ‘cum este utilizat in propozitia ,f4 asta, gi asta, si asta’, Operatorii punct (. ) si sageata ( -> ) Operatort .ipunct) 51> (sdgeatd) se referd la elemente individuale ale structuritor gi uniunilor. Structanle si uriunile sunt tipuri de date agregate la care se poate avea acces sub un singur nume (a se vedea Capitolul 7) ‘Operators! punct este utilizat atunci cng lucrdm cu structuri sau uniuni fective, Operatorul sigeatd este folositImpreund cu un pointer a o structur& sau ia 0 uniune. De exemplu, avand urmatorul fragment de program struct angajati i char nume (801; int virsta, float salariu; ) angays struc: angajati *p Gangaj; /* adresa lui angaj in p */ ali putea sc-ie urmatorul cod pentru a atribui valoarea 123,23 elementulul salariu din variabilo de tip structur& angaj. = 123.23; ee interes Operatorii ( ) gif ] Parantezele rotunde sunt operatori care maresc priritatea operatilor din interlorul lor, In parantezele pStrate se inscriu indicii matricclor (acestea vor fi discutate {olalit in Capitolul 4), Avand o matice, expresia din parantezele patrate este un indice al aceiei matrice. De exemplu, finclude char 5(80]7 void main (void) i sis] = 1x ee ("se” , (3117 [FI Cr+: manual complet atribule ma na valoarea*’ cel deal 8 nA valoarea “cell de-al patra element (tine et matieele incep in G de a0) al malice! spot eigeatl ace cenvenk Rezumatul prioritatilor Tabelut 2-8 pcezintépriortate operat ‘ontate operator in C. Retin cot operator, cu exci operator tna a operator, opereat deg Serge Ie Sap peratorii unari (*, &, -) $i ? opereazd de la dreapta la stanga. ° S NOTA: C++ defineste cativa operatori supli BOTA: ov defioeste cava op iplimentari, care vor fi discutati pe Expresii Qheratorl, constaniele gi varibilele sunt componentele expresilor. © expresie in C.cste orice combinatie vals formata din aceste elemente. Deoarece majoritatea ‘Presiilor tind s& urmeze requiile generale din algebra, echivalenta este deseor! eneralizat, Totusi, céteva e generaizaa, Tous, cBteva aspecte ale expresitor sunt specitice pentru © (3 Ordinea evaluarii Nici standardui ANSI ¢ si ices cee propus pentu ANSI C+* nu specific ordines care sunt evaluate suboxpresie dino expresi. Ele lcd Ia latadine Precedents maxima ou Im 4+ = © (ae tip) % * & sizeof Precedents minima Copitoll 2: Expres 33,7 compilatoruiui rearanjarea unei expresii pentru a elabora codul optim. Aceasta Inseamna ins& c& un cod nu va trebul s& se bazeze pe ordinea in care vor fi evaluate subexpresiile. Oe exemplu, expresia: nu ne asigurd c& f1() va ti apelata tnainte de f2() £10 + #205 Conversia automata in expresii ‘Atunei cand intr-o expresie sunt amestecate constante gi variabile de diferite tipuri, ele sunt convertite in acelast tip. Compilatorul face conversia tuturor elementelor asupra c&rora se opereaza fa tipul celui mai mare, actiune numit& promovarea tipului. Mal intl, toate valorile de tip char si short int sunt automat evaluate ca int. (Acest proces este numit promovarea la Intreg.) O dati inchelat acest proces, toate celelaite conversii sunt efectuate operatie cu operatie, aga cum este descris in urmatorul algoritm de conversie a tipului DACA un element este tong double ATUNCI urmatorul este convertit in tong double ALTFEL DACA un element este double ATUNCI urmétorul este convertit in double ALTFEL DACA un eloment este float ATUNCI urmitorul este convertt in float ALTFEL DACA un element este unsigned long ATUNCI urmétorul este convertit in unsigned long ALTFEL DACA un element este long ATUNCI urmatorul este convert in long ALTFEL DACA un element este unsigned int ATUNCI urmatorul este convertt in unsigned int Existd ined un az, special: dact un element este tong iar celéialt este unsigned int si daci valoarea celui unsigned int nu poate fi reprezentat& ca fong, ambele elemente sunt convertite in unsigned tong. (O data aplicate aces:e reguli de conversie, fiecare pereche de elemente este de acelasi tip iar rezultatulfiecdrei operatli este de acelagi tip cu cu cel al ambelor elemente, De exemplu, s& consider’im conversia de tip care apare in Figura 2-2. Pentru inceput, caracterul eh este convertitintr-un integer iar float f este convertit In double. Apoi, rezuitatu! lui ehvi este convertit in double deoarece fd este double, Rezultatul final este double deoarece, de data aceasta, ambele elemento sunt double, Gr: Manual complet char ch; inti: float f; double ¢; + at nes) ik ane [ns L I int souble float Modelatori Puteli s& fortati o expresie s& devind de un anumit tip utilizand un modelator. Forma generala a unui modelator este: (tip) expresie Unde tip este un tip de dat valid. De exemplu, pentru a va asigura c& expresia x/2 este evaluaté ca fiind de tipul float, veti scrie: Bo ccaes we Modelatorii sunt operatori tehnici. Ca operator, un modelator este unar si are aceeasi prioritate ca oricare operator unar. Desi modelatorii nu sunt uzuali in programare, ei pot fi foarte ulili c&nd acfiunea lor este necesard. De exemplu, s& presupunem ca dorti sd folosili un Intreg pentru a controla o bucla, dar pentru a efectua calculul este necesard o parte fractionara ca in urmatorul program, : #include void main(v ) /* afiseaza i si 4/2 cu zecimale */ cootoul crest FBS ant i; for (i=l; i<=100; ++i) printf ("ed / 2 este: #£\n", i,- (float) 1/2); ) Fard modelatorul (float), s-ar fi efectuat doar impair de intregi. Modelatorul asigurd o& va fi afigatd partea fractionard a raspunsului oy Moras ‘Standardul propus pentru ANSI C++ @ adéugat céfiva operator! no de modelare, ca de exemplu const_cast si static_cast. Acesti modelatori ‘sunt discutafi in Partea a doua. Spatieri si paranteze Puleli s& addugati spatii simple si de tabulare in exoresiilo in G pentru a le face mai usor ce citit, De exemplu, urmatoarele dou expresii sunt identice. O/y>(229/x) x= 10 / y ~(127/x)7 Parantazele in plus sau Tn exces nu implica erori sau incetinirea executiet expresiilo’. Puteti s& utiizati parantezele pentru a clarifica ordinea exact a evaluaii, at&t pentru dvs. cat si pentru ceilalt, De exempiu, care dintre urmétoarele doud expresil este mai usor de citit? | aoy/2-24*tempél27; x= (y/3) ~ (134 mp) & 127 Prescurtari in Existd variatiuni ale instructiunilor de atribuire, uneori numite prescurtai in C, care simplificd codul pentru anumite operatii de atribuire. De exemplu, poate fi scris ca: 30; cow Momsl complet Operatorul += spune compiatorului sd atribule lui x valoarea lui x plus 10. ‘Aceast’ prescurtare este operant’ pentru tofi operatoril binari (aceia care solicité doud elemente de operare). in general, instrucfiuni ca: var = var operator expresie pot fi seriso ca: = expresie Ca alt exemplu, este acelasi lucru cu: % NOTA: Notarea prescurtaté este larg utilzata in scrierea programelor profesionale in C/C++; ar trebui s3 va familiarizati cu ea. 00; Bj c++: Manal complet cest capitol prezinta instructiunile. in cel mai general sens, o instructiune este 0 porfiune @ programului care poate fi executatd, Aceasta inseamna 8 0 Instructiune specific& o actiune. Standardul ANSI C (gi cel propus peniru ANSI C++) impart instructlunile in urmitoarele grupe: B selectie W tterare BW sait M cticheta expresie Bloc Instructiunile de selectie cuprind if si switch, (Deseori este utilizat termenul instruetiune conditional in toc de ,instructiune de selectie",) Instructiunile de iterare sunt while, for si do-while, Acestea mai sunt denumite $/ instructiuni do buolare. Instructiunile de salt sunt break, continue, goto si return. Instructiunile etichetd includ case si default (discutate impreun& cu instructiunea switch) $1 etichetele (discutate cu goto). Instructiunile expresie sunt instructiuni compuse dinte-o expresie valid’. Instructiunile bloc sunt simple blocuri de cod. (Amintit-va c& un bloc incepe cu { si se incheie cu }.) Standardul ANSI C++ propus mai denumeste instructiunile bloc $i instructiuni compuse. NOTA: C++ adauga dou’ tipuri de instructiuni: blocu! try $i instructiunea de declarare. Ele sunt discutate in Partea a doua. De vreme ce multe instructiuni se bazeazé pe rezultatul unui test de conditionare, sd Incepem cu recapitularea conceptelor de adevarat si de fals. Adevarat si Fals in € Multe instructiuni in C se bazeaz pe o expresie de conditionare care determina ccursul actiunilor urmatoare. O expresie conditionala este evaluat ca adevarat sau fals. In C, spre deosebire de alte limbaje, este adevaratd orice valoare diferitd de zero, inclusiv numerele negative, O valoare fais este 0. Aceste concepte de adevérat si fals permit o mare varietate de rutine care pat fi codate foarte eficient, ‘aga cum veli vedea in curand, % NOTA: Chiar daca propunerea de standard ANSI C++ defineste un tip de data Boolean numit boo! (care poate s2 alba doar valorile adevairat $i fals), C++ pastreaza aceleasi concepte generale de adevarat si fals ca $1 C. coptot 3: tain EE Instructiuni de selectic © adimite doua tipuri de instructiuni de selectie: i si switch. In plus, operatorul ? este in anumite condi o alternativa a tui if. if Forma genarala a instructiunil if este: If (expresie) instruotiune; else ins'rucfiune; J> erogram #1 pentru numarul magic. */ #include Hinclude vole main (void) /* numar magic */ /* numa jueator */ int magic? int ghici; magic = rand(); /* genereaza numarul magic */ printf ("ghiceste numarul magic: “)7 BY] c++: moneal complet opt 3: stun EE seanf(*Sd", aghici); ; Af{ghicd == magic) prints (™**corect**™) ; Standardul ANSI C specifica un numér de cel putin 15 niveluri de imbricare. In } practic#, majoritatea comrilatoarelor permit mult mai multe. Mai important este faptul o8 propunerea de ANS! C++ sugereazd cd intr-un program in C++ trebuie si Continund programul num&rului magic, urmatoarea versiune ilustreaz’ fie permise cel putin 256 de niveluri de imbricare pentru if. Totusi, imbricarea uttizarea instructiunii else pentru a afiga un mesaj ca rspuns la introducerea unui | paste mai mult de cAteva niveluri este rareori necesar&, iar imbricarea excesiva numar gresit ingreuneaza infelegerea algoritmului. Putefi sf utlizati un if imbricat pentru imbundtatirea programului numérului /* Program #2 pentru numarul magic. */ magic oferind jucitorului o apreciere asupra numarulul gresit, Hinclude #include 7+ program #3 pentru nunarul magic. */ Hinclude void main (void) finelude int magic; /* numar magic +/ void main (void) int ghici; /* numar jucator +/ 1 int magic; /* numar magic */ Magic = rand(); /* genereaza numarul magic */ int ghiei; /* numar jucator */ peint£(*ghiceste mumarul magic: I scanf("éd, aghiei); magic = rand(}; /* genereaza un numar aleator */ sf (ghiei == magic) print£(™*corect#**); else printf (*Gresit"); printé(%ghicsste numarul magic: “); , - seanf("8a", Eghicl) : if(ghici =5 nagie) | ee fain et 1 Un if imbricat este un if care este obiectul unui alt if sau al unui else. In lee ee cj brogramare i bent ete ent cael Tnean it aeaea sats se pent e at eee Teer noteaune loa mel apron novaniane eoai ectane ee Letgnict > magic) printf! else si care nu este deja asociata unui alt else, De exemplu, core nee ated 7 if imbricat ££{i) | i fl 4£(3) Anstructiune 1; E(B) tnseructhane 2 /+ scene As +/ Scara it-else-if else instructiune 3; /* este asociat acestui else + 1 mau © constructie de programare uzualé este scara i-else-tf, denumita astfel datorit& else instructiune 47 /* asociat cu if(i) +/ felului in care se prezint3, Forma sa general este: __ Aga cum am explicat, else din final nu este asociat cu iff) deoarece el nui se if (expresie) instructiuae; aseste in acelagi bloc. El este asociat lui iff). De asemenea, else din interior este else asociat lui i(k), deoarece acesta este cel mai apropiat if. it (expresie) instructiune; else Ti c++: onal compet It (expresie) instructiune else instructiune; Conditile sunt evaluate de sus in jos. Imediat ce este intalnité 0 conditie adevaraté, va fi executatd instruotiunea asociatd iar restul scarii va fi ignorat. Dacd nici una dintre conditii nu este adevaraté, va fi executat else final, Aceasta inseamna c& dacd toate celelalte condi cad, va fi executat ultima instructiune else. Dacd nu exista un else final, nu va avea loc nici o actiune tn cazul in care celelalte condifi sunt false. Chiar dac& modul de prezentare tn trepte a scdirii precedente i-else-if este tehnic corect, e! poate s8 ducd la o exagerare a numérului de identari. Din acest motiv, scara if-else-if este de obicel prozentata astfel: it (expresie) Instrucfiune; else if (expresio) instrucfiune; else if (expresie) instructiune; else instrucfiune; Utilizand 0 scard if-elsesif, programul cu numere magice devine: J* Program #4 penteu numarul magic. */ include include void main (void) int magic; /* numar magic */ int ghici; /* numar jucator */ magic = rand(); /* genereaza numarul magic */ printf ("ghiceste num scanf(*8d", aghici}: magic: opto 3: suction (ELBE fighiei == magicl [ print# ["**corect* "1; peinté(* #d este numarul magic™, magic); 1 else if(ghici > magic) print (*Gresit, prea mare"); else print £(*Gresit, prea mic"); Alternativa ? 5 Puteti s& utilzati operatorul ? pentru a inlocul instructiunile if-else de forma urmatoare: Xt (condife) expresie; else expresie; Dar subiectul, atat pentru if, cat si pentru else, trebuie sa fie 0 singura expresie -nuo alté instructiune. ‘Operatorul 2 este numit operator ternar deoarece el cere trei elemente asupra c&rora opereaza. El are forma generala: Expt ? Exp2 : Exp unde Exp4, Exp2 51 €xp3 sunt expres. Rene ilizarea si plasareacelor dou * \Valoaree unei expresii 7 este evaluat astfel: se evalueaz’ Expt. Dacd este sdoudeats sip? ste evaiata $i devine valoatea Inept expresi 7. Dacd Expt ‘gevtaed atone oe evalveazd Exp 9 valoarea el dovine valoare expresil 2, De exempla 88 considera | y In acest exemplu, lui y fi este atribuitd vatoarea 100. Dac x ar fi fost mai mic decat 9, y ar fi primit valoarea 200. Acelasi cod scris cu instructiuni if-else ar fi: 10 w9 7 100 2003 x = 10; LE (09) y = 1007 else y = 200; a cept 3: eo SEE HEH cv: nant cont Urmatorul program utilizeazd operatorul ? pentru a ridica la patra o valoare ree) Intreaga introdusé de cétre ullizator, Program pastreazé semnul (10 la patrat este ioe 100 iar -10 la pétrat este -100). ee Hinclude ) esnen OF void main (void) £ a In acest exemplu se renuita la valoarea expresiei ?. Nu trebuie ‘$4 i atribuiti nimic. ATENTIE: Uncle complain de C/O rearanjeazé ordinea de evaluare @ i obiect, Aceasta poste sa expreslin ncerearea do a optimiza codu obiect. Aceast pos Se ate a Gotormine co funojle care formeacd expresia supusé operatoriu ? $8 Se pHinte(*#a pateat este $d°, i, ipatrat); eateries ca te care ’ tnd operator 7, putel si rescieiprogramul cu numere magice Utilizarea operatorului ? pentru Inlocuirea secventel if-else nu este restransa alized aera aa doar la instruciuile de atbuire, Aminij-va 8 toate funcite (cu except calor ee ey deciarate void) pot s& retumeze o valoare. Aste}, pute 36 utiliza una sau mal feet oes muite apelri ale unet furctir into exprese. Cand este tntinit numete func, ea ee este executatd astfel incat si fie determinata valoarea returnatd de ea. De aceea, on Putel sf executal una sau mai multe apetur de functio utiteand operatorul > eee Plasénd apeluie tn expresie care i servesc drept operanzi. ca mat fos vos ne magic; /* momar magic */ Hinclude magic ? printé(*prea mare” b peinté("Prea mic"); £1 tine ni ) prints(*d “, in) : Aici, operatorul ? afiseaz& mesajul corect in functie de testul ghici>magic. @Al C++: Manual complet €xpresii de conditionare Uneori Incepatorii in C (si C++) sunt derutati de faptul c& se poate folosi orice expresie valid’ pentru controlul asupra operatorilor if sau . Aceasta inseamn c& ‘Nu suntetilimitaji la expresil care implic8 operatoril relationall gi logici (precum in cazul limbajelor BASIC sau Pascal). Expresia este evaluat simplu ca valoare zero sau non-zero. De exemplu, urmatorul program citeste doi intregt introdusi de la tastaturd gi afigeazd cAtul lor. El foloseste o instructiune if, controlata de al doilea numér, pentru a evita eroarea objinutd prin imprtirea la zero. /* Imparte primul numar la al doilea. */ #include void main(void) troduceti doua numere: *); scant (“8dad", ga, &b); Af(b) printe(ed\n", a/b); else print£(*Mu pot impart la zero.\n"); i creamalanconeszl dears sac tet 0, con cri conolesz po if ese asd ise va executa else, ale, concifaeste adevarata (nonczor0) 9 are loc impartirea, Scrierea instructiunii if astfel: (on7919) 8 este inutilé, potential ineficienta si consideratd ca lipsité de stil switch © are o instructiune de conditionare multiramura, numita switch, care testeaz’ succesiv valoarea unei expresii fat do 0 list de constante de tip caracter sau Intreg. Cnd se intalneste 0 coincidena, se executd instructiunea asociatd acelei Constante. Forma generalé a instructiunii switch este switen (expresie) { case constantat: secventé de instructiuni break; ‘case constanta2 seoventd de instructiuni break; case constanta3. secventa de instructiuni break: default seovent’ de instructiunt y Este testatd valoarea din expresio, fata de valorile constantelor specificate in instructiunilz case, Cand se intalneste o coincidentd, se executa secventa de instructiuni asociata acelui case pind la instrucfiunea break sau pana cand se ajunge 1a finalul instructiuali switch, instrucliunea default se executd daca nu este inlainita nici o coincidenta. default este optional si, dacd nu este prezent, nu are loc nici 0 actiune daca nu se gaseste nici o potrivire, Standardul ANSI C stipuleaza c& switch poate s& aiba cel putin 257 de instructiuni de tip case. Standardul propus pentru ANSI C++ recomanda s4 poat& introduce cet putin 16.384 de instructiuni de tip case. In practiod, din motive de bficienta, veti dori sa limitaji num&rul de instructiuni case la 0 valoare mai mica Desi case este o instrucliune elichet, ea nu poate exista de una singurd, in afara unel instructiuni switch, Instructiunea break este o instructiune de salt in ©, Puteti s& o utiizati la fel de bine in bucie, ca gi in instruc{iuni switch (dupa cum se vede in sectiunea .Instructiuni de iterare"), Cand se intaineste break intr-0 constructie switch, programul exeout’ un salt la linia de cod care urmeaza instructiunii switch. ‘Trebule sd sti trei lucrurl importante despre instructiunea switch: Bi switch diferd de if prin aceea cA testeaza doar egalitatea, In timp ce If puate ‘88 evalueze orice tip de expresie relafionala sau logic’. In acelagi switch nu pot exista doud constante case cu valori identice. Desigur, doug instructiuni switch, una inclus& in cealalt’, pot s& alb8 aceeasi constanta case. WH Dacd in instructiunea switch sunt utiizate constante de tip caracter, ele sunt automat convertite In Intregl Instructiunea switch este deseori folosité pentru a prelucra comenzile de la tastatura, cum ar fi selectia dintr-un meniu. Aga cum se arata in continuare, functia ‘menu() afigeaza un meniu pentru un program de verificare ortograticd si care apeleazd procedura corespunzétoare: ZB cow: ona compet void menu (void) { chaz hs PEint#(*1. control ortografic\n*): print£(*3, Afiseaza erorile de ortografie\n"); PHinte(* Apssati orice tasta pentru a feat, din switch(ch) [ ae breaks stis_erori(); detaut Practc nstruetunie break sunt oplonae in cnstuctil onal in consrutite switch. Ele incheie secvenia instuctiuniorasoeate une! constante, Dacd sum omice, execute va continua cuinstrufunile din umatorl ease pan est intlnit un break sau pnd fe ingest a suteh ezomot una rmstar loco facilitatea de trecere libera" prin case pentru a simplifica codul ui rs intrarilor de la un driver de dispozitiv; a ieee J+ Proceseaza o valoare */ void manev_intr(int {) t int mareay; marca} = -1; switen (i) case 1 J aceate opt 3: nrc: PE case 2: /* comune de instructiuni */ cage 3 areal = 0; break; case 4 nazeaj = 1; case 5: eroare(marca})+ breaks default procesat (i); 1 Acest exemplu ilustreez’ dou’ aspecte ale lui switch. Primul, pute{i avea instructiuni case care nu au asociate secvente de instructiuni. Cand apar, pur si simply executia sare la urmatorul case. In acest exemplu, primele trei case ‘executdi aceleasi Instructiuni, care sunt: In al doilea rand, executia unei seovente de instructiuni continua cu urmatorul case daca nu este prezentd instructiunea break. Daca i este 4, marcaj este 1 si, deoarece nu existd nici o instructiune break la sfarsitul acestui case, executia continua si se executd agelarea lui eroare(marcaj). Oacd i ar fi fost 5, eroare(marcaj) ar fi trebult s& fie apelat cu valoarea -1 (in loc de 1). Faptul c8 nigte case pot rula impreund atunci cand nu este prezent nici un break previne ropetarea inutilS a instructiunilor, rezultand un cod mult mai eficient. marca} break; Instructiuni switch imbricate Puteti s8 aveti un switch inclus ints-o secvent& de instrucfiuni a unui alt switch, exterior. Chiar daca unele constante case din switch interior gi din cel exterior contin valori comune, nu apar conflicte. De exemplu, urmatorul fragment de cod este perfect valabil switch (x) { ease 1 switer(y) case 0: printf (“impartire la 0, brea Instructiuni de iterare In C, ca $i in alte limbajele de programare moderne, instructiunile de iterare (denumite i bucle) permit ca un set de instructiuni sd se execute repetat, pana se indeplineste o anumitd conditie. Aceasta condilie poate fi predefinité (ca tn buclele for) sau cu sfarsit deschis (ca Tn buclele while $i do-while). Bucla for Conceptul general al buclei for in C este reflectat intr-o forma sau alta'in toate procedurile limbajele structurate de programare, Totusi, in C, el capaté flexibilitate si putere neasteptat3, Forma general a instructiunil for este: {or (iniializare; condifie; increment) instructiune, Bucla for permite multe variafi. Totusi, iiializare este in general o instructiune de atribuire utlizat® pentru a intializa variablla de control a buclet. Condit este 0 lexpresie relationala care determina iesirea din bucld. Increment defineste modul in care se modific’ variabila de control a buclei de fiecare data cand aceasta se repetd, Trebuie sa separali aceste trei sectiuni principale prin punct si virgula. Bucla for continua s8 se execute atata timp cat condilia este adevarata. Cand conditia devine alsa, executia programulul se reia de la instructiunea care urmeaza tut tor jn urmatorul program, o bucld for este utlizata pentru a afiga pe ecran numerele de la 1 fa 100: le void main (void) « pm <= 1007 xt) prinbe(™ad “, xIy pil 3: nro In bucla. x este initializat cu 1 si apoi comparat cu 100. De vreme ce x este mai mic decat 100, se apeleaza printf() iar bucla se reia, ceea ce face ca x sa creascd cu 1 $i sd fie testat din nou pentru a se vedea daca inca este mai mic sau egal cu 400, Dacd este aga, se apeleaz’ printf(). Acest proces se repeta pané cand x devine mai mare ca 100, moment in care bucla se incheie. In acest exemplu, x este variabila de control, care este modificaté si verificata de fiecare data cand ucla se repeta Urmatorul exemplu este o bucld for care reia instructiuni multiple: neg("patratul lui $d, bf", x, 2)7 ‘At&t ridicarea la pitrat a lui x cdt si apelarea lui printf() sunt executate pand ‘cand x devine egal cu 65, Refineti cd bucla este rulaté In sens invers: x este initializat cu 100 gi [a flecare repetare a buclei se scad din el cate 5 unitai Tin bucla for testul de conditionare este efectuat la inceputul ciclului. Aceasta inseamné c& un cod din interiorul buciei poate s4 nu fie executat de loc daca este fais conditia de Inceput. De exemplu, in x= 20; for(y=10; ytexz ++y) printg("sd™, yi printe("#d", y)7_ /* aceasta este singura i printé care se executa */ ucla nu se va executa niciodat’ deoarece x si y sunt egale in momentul interim ucla. Decarece aceasta determina evaluarea expresiei de conditionare ca fais’, nici corpul buclel, nici zona de incrementare a buclei nu se executa, Astfel, y are in continuare valoarea 10 si singura iesire produsa este numdrul 10 afisat 0 singuré data pe ecran Versiuni ale buclei for Sectiunea anterioard a prezentat cea mal uzuald forma a buclel for. Ins, pentru a-i mari puterea, flexibilitatea $i aplicabilitatea In situatli specifice de programare, ‘sunt permise mai multe variatiuni ale lui for. ‘Una dintre cele mai folosite variatiuni foloseste operatorul virgula pentru a permite ce bucla sd fie controlata de doud sau mai multe variabile. (Amintiti-va ca Soperatorul virgula se utiizeazd pentru a altura un numar de expresii in modul .f8 asta gi asta’, dupd cum s-a arStat in Capitolul 2.) De exemplu, variabilele x gi y controleaza urmatoarea bucl& si amandoud sunt inifializate tn interiorul instructiunii for: 1 Bl co4: Manual comple fox(x=0, y=0; xtycl0; tH) [ getchar(); nO"; /* scade codul ASCIZ pentru 0 din y */ Virgula separa cele doua instructiuni de initializare, De fiecare dat cand se fepetd bucla, x este incrementat iar valoarea lui y este introdusd de la tastaturd. Atat x cai si y trebuie s& alba o anumita valoare pentru ca Ducla s se inchele. Chiar dac& vaioarea lui y este introdusd de la tastatur&, y trebuie sé fie inifializat cu 0 astfel incdt vaioarea sa s& fie stabilitS inainte de prima evaluare a expresiel de conditionare. (Dac8 y nu ar fi iniializat, ar putea intamplator s& contin’ valoarea 10, conditia de test devenind falsd si impiedicdnd executia buclei.) Functia converg() din exemplul urmétor, prezint& o bucla cu mai multe variabile de control. Ea afigeazd un sir tiparind caracterele de la ambele capote, convergénd tre mijlocuttiniei specificate. Aceasta solicit pozitionarea cursorulul in diverse Bunete distincte pe ecran. Deoarece C/C++ ruleaza intr-o varletate mare de medi, ele nu definesc o functie de pozitionare a cursorului, Totusi, virtual, toate Compilatoarele de C/C++ asigurd una, chiar dacd numele ei poate $4 difere. Urmatorul program foloseste functia de pozitionare a cursorului din Borland, care ‘se numeste gotoxy(). (Ea solicité figierul antet CONIO.H.) J+ Versiunea Borland. Winclude Hinclude Hinclude ” void converg(int line, chaz *mesai}s void main (void) 1 converg(10, “Acesta este un test pentru converg()."); /* Aceasta functie afiseaza un sir incepind de la stinga Linied specificate. Ea serie caracterele de 1a ambele capete, convergind catre mijloc. */ void converg(int linie, char *mesaj] ( int 4, 4; for(ini, j=strlenimesaj}; cj; ist, [ eros BES Copitolul inte (acs, mesaj[ gotoxy(i, Line); printé ("8c tay: gotoxy (J, line); peinté("ec%, mesaj{j-2))7 al es rextposition(), care chivalntul Microsoft al funetel gotoxy este _set : jects iglru ante graph. rogtamdt ge mai sus, cdicatpenry Mirosaft | tise: devine /* Versiune Microsoft. */ Hinelude #include Hinclude void converg(int line, char *mesaj]i void main (void) i eu converg(}.")7 converg(10, “Acesta este un test pen } 4 pind de la stinga ox fea Ea scrie caracterele de la ambele liniel specificate. ct convergind catre mijloc. capete, void converg[in: linie, char *mesaj) i telenimesaj}; ic}; itt, 3 fl we, i) settextposition( Brinte(*se", mesaj {4-1} settextposition (linge, 3)7 Drint (te, mesaj(}-1]7 1 il ++, va fi necesar $8 consultati manualul acd folosit alt comilator de C/C+*, va utp aarti donee csomU “Tn ambete versiuni ale lui converg(), bucla for util ui aa ely porta aves scot a pela ambete cape, Pe mar ce se la ‘en cfasehiar} seace. Bucla se inchele cand! este mai mare sau egal CU), a asigurand c& toate caracterele sunt scrise. ', 2eegtoresta de conjorare pice (etarea vasaiel de control 2 buco até fogicd. Aceasta inseamné 8 pute sf testali multe condi de inchei ea oe: Mon wa el complet opt 3 Istucan E De exerplu, putes uta urmatoarea func ; uncle pent a inroduce un muneitit (vs uliizatorinteun sistem a stata Uilzatorl poate Icere de Wa ot ie inroducd parol. Bula se nchele cind au fost opueat ‘ cng utilizatorul introduce parola corecta. . Wel Incerea 7 sean ita", 687 void semn (vei. (esd) return ty i char siz(20); ul int x numpatrat (int num) 7 <3 GG steomp(sir, “parola"); +x) ( print£(*éd", num*num) return num*num; fort peint£(*Va og, Sn geteleis)s 1 = Pee ee 8 prvim cu atone la bucta for din main), Remarcat ef fecare parte a buctl (sere ee for este compusd in apelarea unot func care solietd uiizatoruuls cilese un 1 seen es humar introdus de la tastatura. Dac& numérul introdus este 0, bucla se incheie qavetece exprsia de condifonare va fifa. Alf, nmdral va fi iat la patra Aceastd func i Pentre aceasta, bucla for foloseste soovenile de iniiaizae s de Incrementare coast functofoloseste strcmp), functa de bibllotecd standard care compard | fntrun mod neoblul, dar perfect valabil duce-t parola:"); 1 us sil elumeazl @ dal ele unt ont. Bee oo ae df este accea cé pot ips pl din defntia orice pepe a ie, cole rl sectun! ele bucel for poate sf contnd sa general. De fapt, nu este necesar sa existe nici o expresia pentru nici una imeteceereie (estar tues Remarcati cd zona de incrementare a defiitei for este libers. Aceasta : ‘Inseamna cA de fiecare data cand se repetd bucla, este testat x pentru a vedea ine prompt (void) 3 ° daca este egal cu 123, dar nici o alt actiune nu are loc, Daca insa scrieti 123 de la tastaturd conditia devine falsa gi bucla se incheie, ‘De multe on iniializarea se Inialneyle In afara instructiunii for. Acosta so intdmmpld deseori cdnd starea initial a variabilet de control a buclei trebuie sa fie calculata prin metode mai complexe, ca in acest exemplu: void main (void) ( int t; fox {prompt (); t=numeiciti); prompt()) numpatgat (t) 7 getsie); /* citeste un sir ins */ ff(es) «= stelen(s}; /* preia lungimea sirului */ else x = 10; 1 prompt (void) fl for; x<10; } [ printf (*Introduceti un numar: “}; prints ("8d", x)7 return 0; a BSa J++: aml complet Sectiunea de initializare a fost lasata liberd, jar x capatd valoare inainte de intrarea tn bucl&, Bucla infinite Chiar daca puteti utiliza orice instructiune de buclare pentru a crea o bucld infinita, tn mod clasic este utiizat in acest scop for. De vreme ce nu este obligatorie prezenta nici unela din cele trei expresii care formeaza bucla for, puteti sé creati o ucla fr starsit lésdnd necompletatd condifia de control, aga cum se arat8 aici | ee Cand expresia de conditionare este absenti, se presupune c& este adevarati Puteti sa aveli o expresie de initializare i de incrementare, dar programatorii in CIC++ utilizeaz’ mai freevent constructia for(;;) pentru a semnala 0 bucld infinitd, De fapt, constructia for(;) nu garanteazé o buclé infinité deoarece instructiunea break, intainit& oriunde in interiorul corpului buclei, determin incheierea imediat’ @ acesteia (break va fi discutata mai tarziu in acest capitol). Programul se rela ‘atunci de la codul care urmeaz& buclei, asa cum este prezentat mai jos: Printf(* Aceasta bucla va cula la infinit.\n%) ch = ‘or; fort pr) f ch = getchar( 1 /* preia un caracter */ Af(ch=="A") break; /* Sese din bucla */ 1 printf (*ati serie un AN; ‘Aceast& bucla va rula pnd cénd utilizatorul va sorie un A de la tastatur, Bucle for Fr’ corp © instructiune poate sa fie goal’. Aceasta inseamna c& si corpul buclei for (sau al oricirei alte bucle) poate, de asemenea, s& fie gol. Puteti folosi acest lucru pentru ‘@ mari eficienta anumitor algoritmi gi pentru a crea bucle de intarziere. © sarcind uzuali de programare este cea de indepartare a spatilor dintr-un stream de intrare. De exemplu, un program de baze de date poate s8 permit’ o Cerere de genul ,prezintd toate bilanturile mai mici de 400°. Baza de date necesita introducerea distinct’ a fiecdrui cuvant, fr spafi, adie’ ea recunoaste ,baza" dar nu, baza’. Urmatoarea bucla indeparteaza spatile libere de inceput din streamul indicat de cdtre sir. uni EEE Coptolt 3: lnstrucuni 78 fo8 are corp - nei nu ar avea nevoie pk cum puel vedea, aceast bucl8 nu are ve ne. adie Go intariore sul deseo! olste in programe, Urmatorl cod art se ereeazd una pin uizarea li for: Bowe Bucla while Sup etre 7 tH: t Hinclude void umple(cher *s, int lungimels void main (void) t char sir(801; stropy(sir, “acesta este un test"); umple (sir, 40}; printe("sa%, 5 en(sir)); /* Adauga spatii la sfiveitul unui sir. */ void umple(char *s, int Lungime) { int 1; 2 = strlen(s); /* determina lungimea sa */ while(1 100); U) 1Bf c++: manuel complet Probab c& cea mai obi sesibebl cf cea ma obignuts utr» bute dounite est nto func de solectar aon un meniu. Cand utilizatorul introduce un raspuns valid, acesta este i lore a functiei. Un réspuns incorect va determina 0 nous solcitare, Urmatorul cod prezinta o variant imbundtaiits a meniulul de cercetare-verificare i nt Ibu meniului i i vv void menu (void) i char chy peine£(*I, contzol ortografie\n*) 1 print£("2. Corecteaza erorile de ortografie\n": PHINEE(*. Afiseaza exorile de oxtogesfic\my) prine£i" ntroduceti o optiune: “); do { ch = getchar(); /* este sel | ch x gets lectia de 1a tastatura +/ control_orto(); j break, | break; a afis_erori(}; | break; wnsie(eh!="1/ ee cht= °2 ce cht “33 ; M | Ajo, bucla do-while este o alegere bund deoarece veli dori ca un meni S& se execute el putin dala. Cuph co optune au pana cnd se va selecta o optiune valid’. sate, pra Hseva relia Instructiuni de salt © are pay Intuctiul car execu ; xecutd ramificdri neconditionate: return, goto, break | 4. continue Dit orto, rtun gute pol se season n ogra ictiunile break si continue pot fi utilizate impreuna cu oricare din Program insole de clare. aga cum sa discta i mai utilizati break si impreun& cu switch. ee eee es coptott 5: lstrugunt SPER Instructiunea return Instructiunea return este utiizat’ pentru reintoarcerea dintr-0 functie, E taracterizatd drepl instructiune de salt deoarece determina executia sé se feintoared (s8 sar& Inapo)) in punctul in care a fost apelatd functia. return poate sau nu s& aib& asociatd o valoare. Daca return are o asifel de valoare, aceasta devine valoarea returnatd de functie. in C, o functie care nu este void nu trebuie neaparal $8 returnoze o valnare. Dac nu se specificd nici o valoare, se va relurna veve, la intamplare. Tolusi, In C++, 0 functie care nu este void trebuie si Teturneze o valoare, Aceasia inseamnd c& in C++, dacd se mentioneazé ci o funclie retumeaz8 0 valoare, orice instructiune return din cadrul funciiei trebule $8 ibs o valoare asociald ei. ‘Chiar si In C, daca o funciie este declarata ca fatumand o valoare, este chiar bine s& returneze una.) Forma general8 a instructiunii return este: return expresie; Aceasti expresie este prezent& doar daca functia este dectaratd ca returnand 0 valoare. in avest caz, valoarea expresiel va deveni valoarea pe care va returna functia Intro functie puteti $4 utlizati cAte instructiuni return dori. Funclia isi va jncheia executia imediat ce va intélni primul return. Acolada care incheie o functie otermind, de asemenea, iesirea din functie si este echivalent& cu instructiunea return neinsofité de nici o valoare. Daca apare intr-o functie caré nu este void, alunci valoarea retumati este nedefinitt 'D functie deciarata ca void poate si nu contind o instructiune return care sd specific o valoare. (Atata vreme cat o functie void nu poate retuma 9 valoare, aete firese oa nicl o insiruc{iune return dintr-o funetie void s& nu poatd returna vreo valoare.) Pentru mai multe informafil despre return vedeti Capitolul 6. Instructiunea goto Deoarece C are un pachel mare de structuri de contro! $i permite contro! ‘uplimentar prin break si continue, goto este putin necesar. Principala rezervé 2 color mai multi programatori in ceea ce priveste instructiunea goto este tendinta Se dea orca programe lizible. Cu toate acestea, desi instructiunea goto a c&zut in dizgratie acum caliva ani, ea a reusit int-un fel 5 isi mai imbundtaleasca imaginea sifonatd, Nu ex'sté situali in programare care si necesite goto; este Hoar faciitate care, ulilzatd injelept, se face utild intr-un domeniu restrans de Stuatii de programare, Astfel, goto nu este ullizaté in afara acestui domeniu Instructunea goto cere o etichet8 pentru operatie. (O etichetd este un specifcator valid urmat ce punct si virguld.) Mai mult, eticheta trebuie sé se BB c++: mona compat gaseascd in aceeasi functie ca si goto care o utilizeazé, nu puteti sri Intre func Forma generald a instructiunll goto este: goto etichets; etichet’: unde etichetd este orice eticheta valid inainte sau dup goto. De exemplu, putet 58 crea o bul de lat la 100 utlizand goto so tichetd, aga cum se proznts aici ui A£1x<100) goto buclal: Instructiunea break Instructiunea break are doud utilizar, Puteti s8 0 utilizafi pentru a incheia un case intr-o instructiune switch (dup cum s-a discutat mat devreme in acest capitol in. secliunea despre switch) sau puteti s8 0 folositi pentru a determina incheierea imediaté a unei bucle, trecdnd peste testul de conditionare normal, Cénd se intaineste instructiunea break Intr-o bucld, aceasta se incheie imediat jar controlul programului se reia de la instructiunea care urmeaza imediat dup’ ucla. De exemplu: include void main(void) ( int ty for(tso; t<100; t+) printf ("ia “, if(t==10) break; ) afigeaza pe ecran numerele de la 0 la 100. Apoi bucla se termina deoarece break determing incheterea imediatd a buclei, f4rd a mai testa conditia t<100, Copitolul 3: Instrueiun (aa Programatoni o folosesc deseor! In bucle in care este nevoie ca 0 conditie special’ ‘34 ducd la iagire imediatd. Oe exemplu, aici o apasare a unei taste poate opri executia functiei cauta(): cauta(char *nume) C do /* cauta ume... */ Af(kbRit ()) breaks ) white(!gasit); /* urmarize proces */ ) Funotia kbhit() returneazié 0 dac’ nu apasalio tasta, Altfel, ea returneazd 0 valoare nonzero. Din cauza diferentelor dintre mediile de calculatoare, nici standardul ANSI C, nici cel propus pentru ANSI C++ nu definese kbhit(), dar aproape sicur 0 aveti (pe ea Sau Una cu nume aseménator) asigurata de compilatorul dvs. Un break determina iesirea doar din bucla cea mai interioar’. De exemplu, for(two: t<100: +#t) ( contor = 1; fort a) | printe("éd °, conter); 10) breaks afigeazii pe ecran numerele de la 1 la 10 de 100 de ori, De fiecare data cand compilatarul intaineste break, controlul este trecut inapoi buclei for exterioare. ‘Un break utilizat Intro instructiune switch va afecta doar acel switch. El nu afecteazi nici o bucld in interiorul cdreia s-ar atla switch, Funetia exit() Chiar dacd exit() nu este 0 insructiune de contol al programulul, o scurté digresiune este acum bine vent. Asa cum pute ies! dntr-o buci, la fel putet esi ddinteun program, ullizdnd functa exit) din biblioteca standard. Aceast& functie determina incheierea imediat& a unui itreg program, fortind reintoarcerea in sistemul d2 operate. Actioneazd, de fapl, ca un break generalizat FFotma genoralé a functiei exit) este: void exit (int eod_de_intoarcere); Hl cot: Monul complet Valoarea lui cod_de_intoarcere este returnata procesului care a apelat, care este, de obicei, sistemul de operare, Zero este ulilizat in general pentru a’returna Un Cod care indic& terminarea normala a programului, Alte argumente sunt ulilizate pentru a indica unele tipuri de erori Programatorii utiizeazé deseori exit() alunci cAnd nu este indeplinité o anumita conditie obligatorie pentru program. De exemplu, imaginati-w un joc pe calculator In realitate virtuala care necesitd un adaptor gratic special, Functia main() a acestui joc poate s& arate astfel: void main(vold) ( if(!grafica_virtuata()) exit(1); play(; 1 unde grafica_virtuala() este o funclie definité de utilizator care returneaz’ adevirat dacd exist adaptorul de graficd virlual8, Dac adaptorul nu este in sistem, grafica_virtuala returneaz& fals iar programul se incheie. Un alt exemplu este aceasta versiune pentru menu() care faloseste e3 pentru iesirea din program si reintoarcerea in sistemul de operare: void menu (void) { char chy printf (*1, Control ortegrafic\n"|; printt(*2. Corecteaza erorile de ortografie\n"); prinv£("3. Afiseaza erorile de ortografie\n"); print£(*Zesire\n® printe(™ Introduceti optiun aot ch = getchar(); /* citeste selectia de la tastatura */ suieeh (ch) [ case ‘1: control_orto(); break; case ‘27: corect_erori(); break; case °3/: afis_erori (i; coptot 3: train break: case “4: exit (0); /* zeintoarcere in os */ 1 } while(ehi='1! 6s chi= ke chies3"); Instructiunea continue Instructiunea continue lucreaza Intr-un fel ca si instructiunea break. Zn loc insa s& forteze incheierea, continue forjeaza trecerea la urmatoarea iteralie a buciei, ignorand restul codului iteratiei in care se afta. in bucia for, continue determing executia testulul de conditionare i apoi a seoventei de incrementare. Pentru buclele while si do-while controlul programului este trecut testului de conditionare, De exemplu, urmétorul program numdra cate spatii sunt continute tn girul introdus Ge catre utilizator: /* wumara epaciile */ include void main (void) ‘ char 5[80], *siry int spatiuy printf ("introduceti un siz: “); gets is); for(spatiue0; *sir; sirt+) { peice aM itera epatiutt: ) printe(%ed spatii\n®, spatiu): ) Fiecare caracter este testat pentru a se vedea dacd este un spajiu. Daca nu este, instructiunea continue forjeaz bucla for sd treacd la 0 noua iteratie. Dacd el este un spafiu, este ircrementata variabila spatiu Urmatorul exemplu prezint’ modul de utilizare a lui continue pentru a arbi lesirea dintr-o bucl’ fortand testul de conditfonare sé fie efectuat mai repede: FBR cos: manual complet void cod (void) ‘ char gata, chy gata = 0; while(!gata) { jetchar()s Mt gata = 4; continues 1 putchar(ch+l); /* preia litera urmatoare din ‘alfabet */ , Aceastd functie codifica un mesaj schimband toate caracterele pe care le tastali cu litera urmsitoare. De exemplu, A devine B. Functia se va Incheia cand scrieti $, Dupé ce a fost introdus §, nu va mai apairea nici o iesire deoarece testul de conditionare activat de continue va gsi gata adevarat, ceea ce va determina péirdsirea buclei Instructiuni de tip expresie Capitolut 2 acopera in intregime expresille. Totusi, aici mai trebuie mentionate cAteva lucruri. Amintiti-va ca o instrucfiune de tip expresie este pur si simplu 0 expresie valida urmata de punct si virgula, ca in: func(); /* 0 apelare de functie */ a = bic; /* o instructiune de atribuire */ BH; /t 0 : yo nstructiune valida da instructiune vida */ nie */ Prima instrucjiune de tip expresie este o apelare de functie. A doua este una de atribuire. A treia expresie, cea stranie, este totusi evaluat’ de compilatorul C/C++ deoarece functia f() poate sa efectueze o anumité sarcind, Ultimul exemplu araté Cc C permite ca o instrucfiune sa fie vid’ (uneori numitd instrucfiune aula), Instructiuni bloc Instructiunile bloc sunt simple grupuri de instructlunt Inrudite care sunt tratate ca 0 unitate. Instructiunile care formeaza un bioc sunt unite logic, Un bloc incepe cu 0 acolad’ deschisé ({ ) $i se incheie cu corespondentul su, acolada Tnchisd ( }). copton nara EE Cal mai adesea programatoril folosesc instructiunile bloc pentru a crea instructiune multipla ca obiect al unei alte instructiuni, cum ar fif. Totusi, putefi s& slasati o instructiune bloc oriunde ati putea introduce orice alta instructiune. De exemplu, acesta este un cod in C perfect valid (desi neobisnuit): dio-h Hinclude date de tip sir, el permite constante sir. © constanté sir este 0 list de caractere inchise intre ghilimele simple. De exemplu, en opto 4: Matis abot SE hellohetto Nu este necesar si introduceti manual caracterul null fa sfécsitul sirului de ‘Acasta este un test cconstante - compilatorul 0 face automat, pentru dvs. eeste innello C admite 0 gama targ8 de functii de manovrare a sirurlor. Cele mai uzuale sun | e676 prezentate ic int egale. Dacé verifcati RETINETI: strompd) returneaza fals dacd sirurle sunt egale. Daci went toa GEIST: og uoar te chs ut cal Dar stropy(st, $2) Copiaz’ st in s2 ‘condiiel, aga cum s-a aratat. strcat(st, $2) Concateneaza s2 la sfarstul lu st strlen(st) Retureaza lungimea lui st Matrice bidimensionale stromp(s1, $2) Returneaza 0 daca st si s2 sunt identice; mai mic a de mate C admite matrice multidimensionale. Cea mai simpla forma de matrice cane eae aloe Oe ee rmultidimensionala este cea bidimensionald. O matrice bidimensionala este de fapt strchytet, ch) Retumeazd un pointer la prima aparitie a lui ch inst 1 matrice de matrice unidimensionale. Pentru a declara 0 matrice bidimensionala ststi(st, $2) Returneaza un pointer la prima aparijie a tui s2 inst | de intregi numité d, de mirime 10,20, vefi sore: Aceste functiulizeaza islorulantet standard STRING.M. Urmétorul program | J ine ato} (2017 demonstreaz3 cum pot fi utilizate pentru giruri ° pentru! Fiti foarte atenti la declarare. Majoritatea celorialte limbaje folosesc virgule #include pentru a separa dimensiunile matricei; C plaseazd flecare dimensiune in cate 0 #inelude pereche de parantezo dropte. ° Similar, pentru a avea acces la punctl 1,2 al matricel d, vol utliza: void main {void} 1 Bosme el meee) eee Urmatorsl exemplu incared numore de la 1 la 12 intr-o'matrice bidimensionala (sy sile afigeaza rand cu rand. gets (si); gets(s2)+ #include printf£(*lungimi: 4d @d\n™, 4£(!stromp(si, 62) streat(sl, 82); printf ("ts\n", 61); strepy(sl, “Acesta este un test.\n*); en(sl), str print (*Siruril (s2) void Sunt egale\n") : i void) te i, mum[3) (41 fox(te0; te; +#t) printf (st): (400; 147 +44) if(strchr(*hello, ‘e’}} printé(*e eate in hello\n"); num(t} [i] = (ea) Hits if(stestr(*te saluts, “ce")) print£("am gasit te"); /* acum le afiseaza */ for(t=0; e<3; ##t) for (iad; i include #inelude Alor */ /+ 0 baza de date simpla pentru notele studen “+4: Manual complet fidefine CLASE 3 fidefine NOTE 30 int note[CLASE] (NOTE) ; void introd_note (void): int preia_note(int num); void afis_note (int g{] [NOTE]); void main(void) i char ch, sic(80); for(i) { do printf(*(r)nteoducets notele\n™); printf(*(P)rezinta notele\n"); printé(*(g)uit\n"); gets(sizl; ch = mari (sir); J while(cht='E! G& chle'R! && ch switch (ch) [ case ‘E introd_note(); break; case ‘RI: afis_note (note) ; break case ‘0: des (oe 1 /* Invroduceti notele studentilor. +/ void ‘introd note (void) i fori ; EKCLASE; tH#) { printf(*Clasa # Sd:\n™, t+); for(i=0; 1 est evaluat ca adevéret deoarece acresa prim Primula element at unei e aceeagi cu adresa matricei, stunel matron est Dupa cum am mai spus, numele unei m i Spus,numele une! matice fd un indice genereaza pointer. Invers, un pointer poate sa aiba un indi clara ; ibn ince ca gt cu a fs ° matrice. De exemplu, sd ludm acest mic fragment: : eae apioy int *p, £[10]; pIS] = 100; /+ atribuire utilizind indice */ *{pt5) = 100; /* atribuire utilizind aritmetica pointerilor +/ Ambele instruciuni de atibuire plaseaza val wire plaseaza valoarea 100 tn cel de-al saselea sloment li rims iste fesese un ince a lp cea de-a dou ilizeazd artmetica pointerior. In oricare mod rezultatl este acelasi (Capitotul 5 discutd pointeri gi artmetica lor.) qdilasi concep se alictla matcsle de dous sau mal mute dimensiuni. De -xemplu, presupundnd cd a este o matrice de inlregi de 10 pe 10, aceste doud instructiuni sunt echivalente: . inti lemena 04 alu a 0 poste ac ee dou mau on ats]E] on "(aet2). In general pent ones atc simensiona alil{k] este echivalent cu “(ae(lungime rand+%)_ Coptolul 4: Mottice gi sin lea Pointeril sunt uneori folositi pentru a avea acces in matrice deoarece aritmetica pointerilor este in general mai rapid’ decat addugarea de indicl matricei ‘O mattice bidimensionala poate fi redusd la un pointer la 0 matrice unidimensional. De aceea, utilizarea une variabile de tip pointer separatd este © cale usoara de a folosi pointerii pentru a avea acces Ia elementele dintr-un rand al nei matrice bidimensionale, Urmatoarea funotie ilustreaz aceasta tehnicd. Ea va fafiga contin.tul randului specificat al matricei de variabile globale de tip intreg num. int num(10) [20]7 Void afis_cind(int 3) int *p, ty p= snum{3) (01; /* preia adresa primului element al rindului 5 */ for(t=0; t char wateice[3] [3]; /* matricea 0 si x */ char verifica (void); void matrice_init (void) void muta_jucatorul (void) : void mita calculatorul (void) + void afis_matrice (void) ; void main (void) i char gata: nt£(*Aceata este jocul ) si X.\n"): printt(*Veti Juca cu calculaterul.\n")7 gatas ty matrice init (i dol afis_mateice() muta7jueatorul (15 A fata’= verifica(}? /* verifica daca eaista . invingator */ if(gata!= ' ‘) break; /* castigator */ muta_caleulater(); - Af existe ata = verifiea(); /* verifica daca * invingator */ } white(gatas= * *) if(gatas= °K") print£(*Acs efstigat!\n") else print(*An cistigat!!!\n")7 afis_matrice(); /* arata pozitia finala ) /* Initializeaza matricea */

You might also like