Filosofia programatorului. Rezumat: Aspecte filozofice ale programării

Merită să înveți programarea?

„Programare” este un concept foarte larg. Unele limbaje de programare sunt mult mai ușoare decât altele. Unele limbi necesită înțelegerea modului în care programul „vorbește” cu computerul. Cea mai importantă parte a codurilor de învățare este menținerea mișcarea corectă gândire. Ideea nu este să-ți spui „pot să fac asta” sau să citești literatura necesară...

Ideea este aceasta...

Să înveți sau să nu înveți programarea?

Alfabetizarea în orice limbaj de calculator, de la HTML simplu la C++ complex, necesită dedicare nu numai tehnologiei, ci și schimbărilor sale nesfârșite. HTML5 se termină cu un număr dintr-un motiv. Odată ce suficiente browsere web încep să accepte HTML6, dezvoltatorii vor trebui să învețe din nou ceva nou.

Posibile motive pentru care ai dori să te implici într-un nou proces de învățare:

  • Câștigă încredere: am avut mai mulți clienți care au simțit că, dacă ar învăța un limbaj de programare, atunci computerele ar fi mai puțin intimidante pentru ei.
  • Necesitate: probleme tehnice pot apărea în orice moment.
  • Fior: Unii oameni vor doar să învețe noi abilități.
  • Pentru a înțelege ce este posibil: când un dezvoltator spune „Nu se poate face!” Vrea să spună că chiar nu este posibil, sau pur și simplu nu vrea să-și asume această durere de cap?

Fii mereu curios

Nimeni nu vrea să fie un bug pe parbriz. În ceea ce mă privește, nu teama de eșec îi sperie pe oameni, ci teama de posibilitatea de a mă rătăci. Deznădejdea copleșitoare încurajează sentimentele de inferioritate. Curajul și perseverența nu sunt antidotul pentru a te simți copleșit, dar oprirea devreme înainte ca sentimentul să se impună este cel mai bun medicament.

Am trei abordări pentru a rezolva o problemă cu orice proiect:

  • Găsește un subiect care te enervează

Condițiile și plata sunt toate bune. Dar nimic nu-ți va da o grabă mai mare decât o mâncărime la care nu poți ajunge. Într-un viitor promițător, programarea nu ar trebui să fie un scop în sine. Ar trebui să servească drept „lubrifiant pentru uși care scârțâie”.

  • Ar trebui să fiți recompensat pentru efort suplimentar.

După ce au găsit mâncărimea proverbială, oamenii care învață să codifice ar trebui, de asemenea, să găsească ușurare. Niciun tutorial, niciun instrument, nicio laudă nu va ajuta pe nimeni să devină un maestru CODE. Doar după cuvintele „Am scris asta și... uite ce am făcut!” vei simți că ai depășit un obstacol. Va suna stupid până când îl încerci singur. Codul testat care funcționează vă va oferi o adrenalină și vă va face să vă simțiți ca și cum ați devenit un maestru în programarea computerelor.

  • Proiectul tău ar trebui să fie realizat în timp ce creierul tău are poftă de mâncare

Antrenează-ți creierul. Când împinge, antrenorii îi încurajează pe oameni să se împingă un pic mai mult decât limita lor. Învățarea înseamnă foame. Creierul tău are întotdeauna apetit pentru cunoștințe noi.

Practicați zilnic

Singura modalitate de a învăța programarea și de a o aminti pentru totdeauna este să exersezi în fiecare zi. Ca și în cazul învățării oricărei abilități noi, un program consecvent de noi scopuri și obiective vă va șlefui treptat abilitățile până la perfecțiune.

Immanuel Kant, escrocul filosofiei, a venit cu un lucru grozav pentru angosticism. Așa-numitul „lucru în sine”. Un lucru extrem de interesant.
Trucul este acesta: în procesul epistemologic obișnuit există o legătură obiect-subiect. Acestea. Există întotdeauna un obiect pe care subiectul îl cunoaște.
Sunt multe puncte de vedere pe care le cunoaștem (idealismul, materialismul și mișcările lor ulterioare), dar numai Kant le-a depășit pe toate.
În înțelegerea lui, poți cunoaște un lucru doar dacă îți permite să faci asta. De exemplu, dacă un lucru vrea să rămână închis, nu vei ști niciodată că este din lemn, chiar dacă l-ai văzut.
Acestea. el înzestrează obiectul cu voinţă, echivalându-l cu subiectul. Astfel, atâta timp cât știi lucrul, lucrul te va cunoaște. Relațiile cu mai multe niveluri au migrat către cele cu un singur nivel.

Pare o nebunie, dar confirmarea acestei ipoteze se găsește peste tot. De exemplu, pătratul negru al lui Malevici. Mulți îl consideră doar un pătrat negru, dar pentru alții are o semnificație profundă.
Este foarte posibil ca pătratul pur și simplu să nu se fi deschis pentru tine, dar altcineva a găsit o perspectivă în el. Și sunt multe astfel de cazuri. La urma urmei, mulți oameni trec adesea pe lângă ceva și apoi o persoană face dintr-o dată o descoperire/invenție literalmente lucruri simple, care zaceau în jurul nostru, dar noi „nu le-am observat”. Poate nu că nu le-am observat, dar că lucrurile nu ne-au fost dezvăluite? Această poziție extrem de controversată și interesantă are șanse foarte reale de a exista în realitate.

De exemplu, dacă universul ar fi un program uriaș, ar dori creatorul să creeze diferite clase pentru a descrie diferite obiecte? Bineînțeles că nu, pentru că toată lumea se străduiește pentru un minim de energie, fiecare este cât poate de leneș. Prin urmare, pentru a nu deranja prea mult, programatorul universal va crea o singură clasă pentru toate obiectele. Și va trebui să gestioneze doar un singur tip de interacțiune obiect-obiect. Și este foarte posibil ca tocmai din această cauză, un obiect să înțeleagă un alt obiect doar atunci când decide să se deschidă față de el.

A doua observație interesantă constă în viziunea asupra lumii și a valorilor.
Valori a acestei lumi, ne modelează viziunea asupra lumii, care, la rândul său, ne modelează valorile.
Acest cerc vicios se reflectă ușor în programare:

Funcție Vedere asupra lumii(Valori) Valori = Algoritm pentru calcularea valorilor() Valori returnate Sfârșitul funcției Programul principal Buclă (se repetă la nesfârșit)( Valori = Viziunea lumii (Valori)) Sfârșitul programului

Există o mulțime de corelații interesante similare între filozofie și programare.

După cum știți, un computer este capabil să înregistreze cuvinte (text) și obiecte (modele 3D, imagini). Singurul decalaj care stă în calea creării AI este conceptul. Acestea. ceea ce face legătura între cuvânt și obiect. Dacă cineva își dă seama cum să pună un sistem de concepte într-o mașină, atunci va fi creată IA.

Dmitri Yakushev

"Filozofie"

programare în limbaj C++

a doua ediție, extinsă și corectată

UDC 004.43 BBK 32.973.202

Yakushev D. M.

I49 „Filosofia” programării în C++. / D. M. Yakushev. - Ed. a II-a. - M.: Presa Buk, 2006. - 320 p.

ISBN 5 9643 0028 6

Autorul limbajului C++ este Bjarne Stroustrup, angajat al celebrei companii AT&T. C++ (sau mai bine zis, predecesorul său, C cu clase) a fost creat sub influența limbajului Simula (trebuie spus că acest limbaj de programare a apărut încă din 1967). De fapt, până la apariția C++, C câștigase deja popularitate; programatorii profesioniști îl respectă pentru capacitatea sa de a profita de o arhitectură specifică în timp ce scriu programe într-un limbaj relativ nivel inalt.

În prezent, C++ este unul dintre cele mai populare (dacă nu cel mai popular) limbaje de programare. Este C++ care vă permite să scrieți un program folosind abordări orientate pe obiecte (și programele care necesită acest lucru sunt de obicei foarte mari) și, în același timp, să fiți destul de „rapide”.

Această carte va introduce cititorul în „filozofia” și fundamentele programării în C++. Cartea conține multe exemple, compilate și testate de autor.

UDC 004.43 BBK 32.973.202

Partea 1.

Capitolul 1. C++ este un limbaj de programare cu scop general. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

Capitolul 2. Vocabular. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Capitolul 3. Sintaxă. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Capitolul 4. Domeniul de aplicare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Capitolul 5. Definiții. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Capitolul 6. Aspect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Capitolul 7. Clasele de memorie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Capitolul 8. Tipuri de bază. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Capitolul 9. Tipuri derivate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 ​​​​Capitolul 10. Obiecte și LVALUE (adrese). . . . . . . . . . . . . . . . . . . . . . . . .15 Capitolul 11. Simboluri și numere întregi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 Capitolul 12. Transformări. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Capitolul 13. Expresii și operații. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Capitolul 14. Descrieri. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 Capitolul 15. Specificatorii clasei de memorie. . . . . . . . . . . . . . . . . . . . . .31 Capitolul 16. Descriptori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Capitolul 17. Descrierile claselor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 Capitolul 18. Inițializarea. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51 Capitolul 19. Nume de funcții supraîncărcate. . . . . . . . . . . . . . . . . . . . .58 Capitolul 20. Descrierea enumerarii. . . . . . . . . . . . . . . . . . . . . . . . . . . . .59 Capitolul 21. Descrierea Asm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60 Capitolul 22. Operatori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61 Capitolul 23. Definiții externe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66

Capitolul 24. Liniile de comandă compilator. . . . . . . . . . . . . . . . . . . . .68 Capitolul 25. Prezentare generală a tipurilor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 Capitolul 26. Considerații privind mobilitatea. . . . . . . . . . . . . . . . . . . . . . . . . .75 Capitolul 27. Memoria liberă. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76

Partea 2. Turbo C++

Capitolul 1. Mediul de dezvoltare integrat. . . . . . . . . . . . . . . . . . . .78 Capitolul 2. Bara de meniuri și meniuri. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Capitolul 3. Ferestrele TURBO C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Capitolul 4. Lucrul cu meniul de pe ecran. . . . . . . . . . . . . . . . . . . . . . . . . . . . .80

Capitolul 5. Structura fișierelor, tipuri de date și operatori de intrare/ieșire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87

Capitolul 6. Operații aritmetice, logice, relaționale și de atribuire. . . . . . . . . . . . . . . . . . . . . . .91

Capitolul 7. Organizarea logică a programului și cea mai simplă utilizare a funcțiilor. . . . . . . . . . . . . . . . . . . . . . . . . .95

Capitolul 8. Organizarea logică a unui program simplu. . . . . . . . . . .95 Capitolul 9. Utilizarea constantelor tipuri variate. . . . . . . . . . . . .96 Capitolul 10. Structuri de control. . . . . . . . . . . . . . . . . . . . . . . . . . . .98

Capitolul 11. Tehnici de declarare și accesare a tablourilor, folosind funcții și directiva define

atunci când lucrați cu matrice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100

Partea 3. De la teorie la practică

Capitolul 1. Regula „dreapta la stânga”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103 Capitolul 2. STLport. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 Capitolul 3. Limbajul de programare de la Microsoft: C#. . . . . . . . . . . . . .106 Capitolul 4. C++ Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108 Capitolul 5. Utilizarea indicatoarelor „inteligente”. . . . . . . . . . . . . . . . . . . . . .111 Capitolul 6. Discuții pe tema indicatoarelor „inteligente”. . . . . . . . . . . . . .116 Capitolul 7. Destructori virtuali. . . . . . . . . . . . . . . . . . . . . . . . . . . .122 Capitolul 8. Scrierea structurilor de date în fișiere binare. . . . . . . . . . . .126

Capitolul 9. Operatorul de salt necondiționat goto. . . . . . . . . . . . . . . . . .132 Capitolul 10. Constructor virtual. . . . . . . . . . . . . . . . . . . . . . . . . . .136 Capitolul 11. Citirea textelor sursă. . . . . . . . . . . . . . . . . . . . . . . . . . . .141 Capitolul 12. Funcția gets(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 Capitolul 13. Proprietăţi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146 Capitolul 14. Comentarii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 Capitolul 15. Programare web. . . . . . . . . . . . . . . . . . . . . . . . . . . . .154 Capitolul 16. Erori în lucrul cu memoria. . . . . . . . . . . . . . . . . . . . . . . . . .158 Capitolul 17: Crearea graficelor cu ploticus. . . . . . . . . . . . . . .161 Capitolul 18. Automatizarea și motorizarea aplicației. . . . . . . . . . .164 Capitolul 19. Revizuirea compilatoarelor C/C++ EMX și Watcom. . . . . . . . . .183 Capitolul 20. Utilizarea directivei #import. . . . . . . . . . . . . . . . . . .188

Capitolul 21: Crearea capcanelor de sistem

Windows pe Borland C++ Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204 Întrebări și răspunsuri. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214

PUBLICAȚIE ȘTIINȚIFICĂ POPULARĂ

Iakusev Dmitri Mihailovici

„FILOZOFIA” PROGRAMĂRII ÎN LIMBAJUL C++

redactor-șef B.K. Leontyev

redactor-șef A. G. Benetashvili

Aspect original de I. V. Tsarik

Artistul O. K. Alekhine

Editor artistic M. L. Mishin Editor tehnic K. V. Shapiro

Corectori L. S. Zimina, K. V. Tolkacheva

Semnat pentru publicare la 05/07/2006. Format 60x90/16. Font Newton. Hartie offset. Imprimare offset. Pech. l. 20. Tiraj 3000.

Introducere în limbajul de programare C++

Partea 1. Introducere în limbaj

programare C++

C++ - limbaj de programare de uz general

Autorul limbajului C++ este Bjarne Stroustrup, angajat al celebrei companii AT&T. C++ (sau mai bine zis, predecesorul său, C cu clase) a fost creat sub influența Simula (trebuie spus că acest limbaj de programare a apărut încă în 1967). De fapt, până în acel moment (când a apărut C++), C câștigase deja popularitate; Este, în general, foarte respectat pentru capacitatea sa de a exploata capacitățile unei anumite arhitecturi, utilizând totuși un limbaj de nivel relativ înalt. Adevărat, de obicei tocmai acesta este motivul pentru care nu-l place. Desigur, în acest caz, unele prevederi pentru construirea de programe au fost pierdute (sau distorsionate); de exemplu, în C nu există practic nicio capacitate de a crea programe modulare. Nu, bineînțeles că sunt create, dar cu ajutorul unor „cârje” sub forma utilizării directivelor de preprocesor - nu există o astfel de modularitate ca, de exemplu, în Modula 2 sau Ada, în C. Apropo, acest lucru nu este încă cazul în C++.

De la bun început, s-a subliniat că C++ este o dezvoltare a limbajului C, poate o parte din dialectul său. Acest lucru este dovedit de faptul că primul compilator (încă există) a fost cfront, care a tradus codul sursă C++ în cod sursă C. Această opinie încă există și, trebuie spus, încă nu este neîntemeiată; cu toate acestea, C și C++ - limbi diferite programare.

Principala diferență dintre C++ când a apărut pentru prima dată a fost suportul său explicit pentru o abordare orientată pe obiecte a programării. Trebuie să înțelegeți că programarea folosind OOP și OOA se poate face oriunde, chiar dacă setul de instrumente nu o acceptă în mod explicit; ca exemplu, puteți lua biblioteca interfeței cu utilizatorul

Introducere în limbajul de programare C++

Fața GTK+, care este scrisă în C „pur” și folosind principiile „designului” orientat pe obiecte. Introducerea instrumentelor de sprijinire a OOP într-un limbaj de programare înseamnă că la etapa de compilare (și nu la etapa de execuție a programului) se va verifica compatibilitatea tipurilor, prezența metodelor etc. În principiu, acest lucru este destul de convenabil.

Din nou, la fel cum C nu este un limbaj de programare de nivel înalt (pentru că permite prea multe trucuri), C++ nu este, strict vorbind, un limbaj de programare orientat pe obiecte. Acest lucru este împiedicat de caracteristici precum prezența funcțiilor virtuale (pentru că atunci când vorbim despre polimorfism, nimeni nu prevede niciodată că unele metode vor participa la el, iar altele nu), prezența funcției main() etc. În plus, C++ nu are astfel de entități precum, de exemplu, metaclase (deși probabil că nu sunt atât de necesare) și interfețe (este folosită în schimb moștenirea multiplă). Cu toate acestea, C++ este în prezent unul dintre cele mai populare (dacă nu cel mai popular) limbaje de programare. De ce? Da, pentru că toate aceste „monstrozități” fac în cele din urmă posibilă scrierea unui program folosind abordări orientate pe obiect (și programele care necesită acest lucru sunt de obicei foarte mari) și în același timp destul de „rapide”. Acest lucru este facilitat tocmai de prezența funcțiilor virtuale (adică ceea ce programatorul însuși împarte în timpul proiectării, unde va avea nevoie de polimorfism și unde va fi suficient să combinați unele funcții într-un grup în funcție de anumite caracteristici), prezența obligatorie a un optimizator și așa mai departe. Toate acestea vă permit, dacă sunt utilizate corect, să scrieți în continuare un program de lucru. Adevărat, există destul de des exemple de utilizare analfabetă, în urma cărora alegerea C++ pentru implementarea proiectelor se transformă în tortură pentru programatori și management.

În prezent, există un standard pentru limbajul de programare C++, care include, printre altele, o bibliotecă de șabloane standard. Șabloanele sunt un subiect aparte; din punct de vedere formal, sunt și „cârje” pentru a face, ca să spunem așa, polimorfism la etapa de compilare (și în această calitate sunt foarte utile), dar biblioteca

Fără îndoială o inovație corectă din toate părțile. Având, în sfârșit, modalități standard de a sorta o listă într-un mod portabil (adică, de la compilator la compilator) (pe lângă scrierea personală a tuturor subrutinelor și structurilor de date corespunzătoare) a făcut viața programatorului mult mai ușoară. Adevărat, mulți oameni încă nu înțeleg cum funcționează STL și cum să-l folosească (cu excepția std::cin și std::cout ).

Introducere în limbajul de programare C++

O etapă importantă în dezvoltarea programării a fost crearea și distribuirea pe scară largă a limbajului C++. Acest limbaj, păstrând instrumentele limbajului C (limbaj orientat pe procedura), care a devenit un standard general recunoscut pentru scrierea programelor de sistem și aplicații, a introdus

oportunități de practică de programare pentru o nouă abordare tehnologică a dezvoltării software, numită „programare orientată pe obiecte”.

Limbajul de programare C++ este C*, extins prin introducerea de clase, funcții inline, operatori supraîncărcați, nume de funcții supraîncărcate, tipuri de constante, referințe, operațiuni de gestionare a memoriei libere, verificarea parametrilor funcției.

Introducerea unei paradigme orientate pe obiecte în practica scrierii programelor conduce la dezvoltarea de noi domenii ale informaticii, o creștere semnificativă a nivelului de fabricabilitate a software-ului creat, o reducere a costurilor de dezvoltare și întreținere a programelor, a acestora. reutilizare, implicarea în procesul de extindere a capacităţilor intelectuale ale calculatoarelor.

Abordarea prin obiect a modelării informaționale a domeniilor de studiu este folosită din ce în ce mai mult ca bază pentru structurarea reflecțiilor lor informaționale și, în special, a bazelor de cunoștințe.

C++ este un limbaj de programare de uz general. Acest limbaj special este bine cunoscut pentru eficiența, economia și portabilitatea sa.

Aceste avantaje ale C++ asigură o bună calitate a dezvoltării aproape oricărui tip de produs software.

Utilizarea C++ ca limbaj instrumental vă permite să obțineți programe rapide și compacte. În multe cazuri, programele scrise în C++ sunt comparabile ca viteză cu programele scrise în limbaj de asamblare.

Să enumerăm câteva caracteristici esențiale ale limbajului C++:

C++ oferă un set complet de operatori de programare structurată;

C++ oferă un set neobișnuit de mare de operații;

Introducere în limbajul de programare C++

Varietatea operațiunilor vă permite să alegeți diferite seturi ale acestora pentru a minimiza codul rezultat;

C++ acceptă indicatorii către variabile și funcții;

Un pointer către un obiect program corespunde adresei mașinii acelui obiect;

Folosind judicios indicatori, puteți crea programe care rulează eficient deoarece... pointerii vă permit să vă referiți la obiecte în același mod ca un computer;

C++ acceptă aritmetica pointerului și permite astfel accesul direct și manipularea adreselor de memorie.

Capitolul 2. Vocabular

Există șase clase de jetoane: identificatori, cuvinte cheie, constante, șiruri, operatori și alți delimitatori. Caracterele și comentariile de spațiu, tabulator și linie nouă (colectiv, „spații albe”), așa cum este descris mai jos, sunt ignorate, cu excepția cazului în care servesc ca delimitatori de simboluri.

Este necesar un spațiu alb pentru a separa identificatorii, cuvintele cheie și constantele care altfel s-ar atinge reciproc. Dacă fluxul de intrare este tokenizat până la un anumit caracter, se presupune că următorul jeton conține cel mai lung șir de caractere care poate forma jetonul.

Comentarii

Simbolurile /* indică începutul unui comentariu care se termină cu simbolurile */. Comentariile nu pot fi imbricate.

Caracterele // încep un comentariu care se termină la sfârșitul rândului pe care apar.

Identificatori (nume)

Multe operațiuni C++ corespund instrucțiunilor mașinii și, prin urmare, pot fi traduse direct în codul mașinii;

Identificator - o succesiune de litere și numere de lungime arbitrară; primul caracter trebuie să fie o literă; Litera de subliniere „_” este considerată litera wu; literele mari și mici sunt diferite.

Identificatorii semnati și volatili sunt rezervați pentru utilizare ulterioară.

constante

Există mai multe tipuri de constante. Mai jos este un scurt rezumat al caracteristicilor hardware care le afectează dimensiunile.

Constante întregi

O constantă întreagă constând dintr-o succesiune de cifre este considerată octală dacă începe cu 0 (cifra zero), iar zecimală în caz contrar. Numerele 8 și 9 nu sunt cifre octale.

O secvență de cifre precedată de 0x sau 0X este acceptată ca număr întreg hexazecimal.

Cifrele hexazecimale includ literele a sau A la f sau F, cu valori cuprinse între 10 și 15.

O constantă zecimală a cărei valoare este mai mare decât cel mai mare număr întreg de mașină cu semn este considerată lungă; constantă octală și hexazecimală a căror valoare depășește cea mai mare

Introducere în limbajul de programare C++

gât mașină întreg cu un semn, este considerat lung; în alte cazuri, constantele întregi sunt tratate ca int.

Constante lungi explicite

O constantă zecimală, octală sau hexazecimală urmată imediat de l (litera latină „el”) sau L este considerată o constantă lungă.

Constante de caractere

O constantă de caracter constă dintr-un caracter înconjurat de ghilimele simple (apostrofe), cum ar fi „x”. Valoarea unei constante de caractere este valoarea numerică a caracterului din setul de caractere (alfabet) al aparatului.

Constantele de caractere sunt considerate date de tip int . Unele caractere negrafice, ghilimele simple" și backslash\, pot fi reprezentate conform următoarei liste de secvențe de escape:

caracter nou linie NL(LF)

filă orizontală NT

filă verticală VT

reveniți la pasul BS

retur cărucior CR

Traducere în format FF

bară oblică inversă\

ghilimele simple (apostrof) "

set de biți 0ddd

set de biți 0xddd

Secvența de escape \ddd constă dintr-o bară oblică inversă urmată de 1, 2 sau 3 cifre octale care specifică valoarea caracterului dorit. Un caz special al acestui construct este \0 (nu este urmat de nicio cifră), care specifică caracterul gol NULL .

Secvența de escape\xddd constă dintr-o bară oblică inversă urmată de 1, 2 sau 3 cifre hexazecimale care specifică valoarea caracterului dorit. Dacă caracterul care urmează barei oblice inversă nu este unul dintre cei enumerați, atunci bara oblică inversă este ignorată.

Introducere în limbajul de programare C++

Constante în virgulă mobilă

O constantă în virgulă mobilă constă dintr-o parte întreagă, un punct zecimal, o mantisă, e sau E și un exponent întreg (posibil, dar nu neapărat, cu semn). Partea întreagă și mantisa constau ambele dintr-o succesiune de cifre. Întreaga parte sau mantisa (dar nu ambele) pot fi omise; sau punctul zecimal sau (E) împreună cu întregul exponent (dar nu ambele părți în același timp) pot fi omise. Constanta în virgulă mobilă este de tip double.

Constante enumerate

Numele descrise ca enumeratori sunt constante

na int .

Constante descrise

Un obiect de orice tip poate fi definit ca să aibă o valoare constantă pe toată durata numelui său. În cazul pointerilor, declaratorul *const este folosit pentru a realiza acest lucru; Pentru obiectele non-pointer, este utilizat descriptorul const.

Un șir este o secvență de caractere cuprinsă între ghilimele duble: „...”. Șirul are un tip de matrice de caractere și o clasă de stocare static și este inițializat cu caracterele date.

Compilatorul plasează un octet nul \0 la sfârșitul fiecărei linii, astfel încât un program care scanează linia poate găsi sfârșitul acesteia.

Caracterul ghilimele duble „ trebuie să fie precedat de \ într-o linie; în plus, pot fi folosite aceleași secvențe de escape care au fost descrise pentru constantele de caractere.

Și, în sfârșit, caracterul newline poate apărea numai imediat după \ ; atunci atât -\ cât și caracterul newline sunt ignorate.

Capitolul 3. Sintaxă

Sintaxa de înregistrare

Conform regulilor sintactice de înregistrare, categoriile sintactice sunt evidențiate cu caractere cursive, iar cuvintele și simbolurile literale sunt evidențiate într-un font de lățime constantă.

Introducere în limbajul de programare C++

Categoriile alternative sunt scrise pe rânduri diferite. Un simbol terminal opțional sau non-terminal este indicat prin indicele „opt”, astfel încât (opt) indică faptul că expresia dintre acolade este opțională.

Nume și tipuri

Un nume denotă (indică) un obiect, funcție, tip, valoare sau etichetă. Numele este introdus în program prin descriere. Un nume poate fi folosit numai într-o zonă a textului programului numită domeniul său. Un nume are un tip care îi determină utilizarea.

Un obiect este o zonă de memorie. Un obiect are o clasă de memorie care îi determină durata de viață. Semnificația valorii găsite într-un obiect este determinată de tipul de nume folosit pentru a-l accesa.

Zona de vizibilitate

Există patru tipuri de domeniu: local, fișier, program și clasă.

Local

Un nume descris într-un bloc este local pentru acel bloc și poate fi folosit numai în acel bloc după locația declarației și în blocurile pe care le acoperă.

Excepție fac etichetele, care pot fi folosite oriunde în funcția în care sunt descrise. Numele parametrilor de funcție formală sunt tratate ca și cum ar fi fost declarați

V blocul exterior al acestei funcții.

Un nume declarat în afara oricărui bloc sau clasă poate fi folosit în fișierul în care este definit, după locul declarației.

Numele unui membru al clasei este local pentru clasa sa și poate fi folosit numai într-o funcție membru a acelei clase, după ce operația > a fost aplicată unui obiect din clasa sa sau după ce operația > a fost aplicată unui pointer către un obiect al clasei sale.

Membrii clasei statici și membrii funcției pot fi, de asemenea, referiți utilizând operatorul :: unde numele clasei lor este în domeniu.

Introducere în limbajul de programare C++

O clasă declarată în cadrul unei clase nu este considerată membru, iar numele ei aparține domeniului de aplicare.

Un nume poate fi ascuns prin definirea explicită a aceluiași nume într-un bloc sau clasă. Un nume dintr-un bloc sau clasă poate fi ascuns numai de numele descris în blocul sau clasă acoperită.

Un nume non-local ascuns poate fi folosit și atunci când domeniul său este specificat de operatorul ::.

Un nume de clasă ascuns de un nume care nu este un nume de tip poate fi folosit în continuare dacă este precedat de class , struct sau union . Un nume de enumerare enum ascuns de un nume care nu este un nume de tip poate fi folosit în continuare dacă este precedat de enum .

Capitolul 5. Definiții

O declarație este o definiție, cu excepția cazului în care descrie funcții fără a specifica un corp de funcție, când conține specificatorul extern(1) și nu există inițializator sau corp de funcție sau când este o declarație de clasă.

Capitolul 6. Aspect

Un nume de fișier care nu este declarat în mod explicit static este comun pentru fiecare fișier dintr-un program cu mai multe fișiere. Acesta este și numele funcției. Se spune că astfel de nume sunt externe.

Fiecare descriere nume externîntr-un program se referă la același obiect, funcție, clasă, enumerare sau valoare de enumerator.

Tipurile specificate în toate declarațiile de nume externe trebuie să fie identice. Pot exista mai multe definiții de tip, enumerare, funcție inline sau const non-compozit, cu condiția ca definițiile să fie identice, să apară în fișiere diferite și toți inițializatorii să fie expresii constante.

Introducere în limbajul de programare C++

În toate celelalte cazuri, trebuie să existe exact o definiție pentru numele extern în program.

O implementare poate cere ca o const compusă folosită acolo unde nu este întâlnită nicio definiție a const trebuie să fie declarat explicit extern și să aibă exact o definiție în program. Aceeași restricție poate fi impusă funcțiilor inline.

Capitolul 7. Clasele de memorie

Sunt descrise două clase de memorie:

auto

static.

Obiectele automate sunt locale pentru fiecare apel de bloc și sunt resetate la ieșire.

Obiectele statice există și își păstrează valoarea pe tot parcursul programului.

Unele obiecte nu sunt asociate cu nume, iar durata lor de viață este controlată în mod explicit de operatorii new și delete.

Capitolul 8. Tipuri de bază

Obiectele declarate ca caractere (char) sunt suficiente pentru a stoca orice element al setului de caractere al mașinii, iar dacă un caracter aparținând acelui set este stocat într-o variabilă de caractere, atunci valoarea acestuia este egală cu codul întreg al acelui caracter.

În prezent, există trei dimensiuni întregi, descrise ca short int , int și long int . Inturile lungi oferă cel puțin la fel de multă memorie ca și inții scurte, dar atunci când sunt implementate, fie lungi, scurte sau ambele pot deveni echivalente cu un întreg obișnuit.

Ansambluri „obișnuite” au o dimensiune naturală, determinată de arhitectura mașinii centrale; alte dimensiuni sunt făcute pentru a se potrivi nevoilor speciale.

Introducere în limbajul de programare C++

Fiecare enumerare este un set de constante numite. Proprietățile enum sunt identice cu proprietățile int. Numerele întregi fără semn, descrise ca nesemnate, respectă regulile aritmeticii modulo2n, unde n este numărul de biți din reprezentarea lor.

Numerele cu virgulă mobilă de precizie simple (float) și duble (duble) pot fi sinonime în unele implementări ale mașinii.

Deoarece obiectele din tipurile enumerate mai sus pot fi interpretate cu ușurință ca numere, ne vom referi la ele ca tipuri aritmetice.

Tipurile char, int de toate dimensiunile și enum vor fi numite colectiv tipuri întregi. Tipurile float și double vor fi numite colectiv tipuri flotante.

Tipul de date void definește un set gol de valori. Valoarea (inexistentă) a unui obiect nu poate fi utilizată în niciun fel și nu pot fi aplicate nici conversiile explicite, nici implicite.

Deoarece o expresie goală denotă o valoare inexistentă, o astfel de expresie poate fi folosită doar ca operator de expresie sau ca operand din stânga într-o expresie punct și virgulă. O expresie poate fi convertită în mod explicit în tipul void.

Capitolul 9. Tipuri derivate

Pe lângă tipurile aritmetice de bază, există conceptual un număr infinit de tipuri derivate, construite din tipurile de bază, după cum urmează:

rețele de obiecte de acest tip;

funcții care primesc argumente de un anumit tip și returnează obiecte de un anumit tip;

pointeri către obiecte de acest tip;

constante care sunt valori de un anumit tip;

Introducere în limbajul de programare C++

structuri, care sunt clase fără restricții de acces;

asociaţii, care sunt structuri care pot timp diferit conțin obiecte de diferite tipuri.

ÎN În general, aceste metode de construire a obiectelor pot fi utilizate recursiv.

Un obiect de tip void* (un pointer către void) poate fi folosit pentru a indica obiecte de tip necunoscut.

Obiecte și LVALUE (adrese)

Un obiect este o zonă de memorie; lvalue (adresa) este o expresie care se referă la un obiect. Un exemplu evident de expresie de adresă este numele unui obiect.

Există operații care produc expresii de adresă: de exemplu, dacă E este o expresie pointer, atunci *E este o expresie de adresă care se referă la obiectul indicat de E .

Termenul „lvalue” provine din expresia de atribuire E1=E2, în care operandul din stânga E1 trebuie să fie o expresie de valoare.

Discuția de mai jos pentru fiecare operator specifică dacă necesită operanzi de adresă și dacă returnează o valoare de adresă.

Capitolul 11. Caractere și numere întregi

Un caracter sau un întreg scurt poate fi folosit dacă se poate folosi un întreg. În toate cazurile, valoarea este convertită într-un număr întreg.

Conversia unui număr întreg scurt într-un număr întreg lung implică întotdeauna extinderea semnată; numerele întregi sunt mărimi cu semne. Dacă caracterele conțin sau nu un bit de semn depinde de mașină. Tipul de caracter nesemnat mai explicit limitează valoarea de la 0 la un maxim dependent de mașină.

Pe mașinile în care caracterele sunt tratate ca semnate, caracterele setului de cod ASCII sunt pozitive.

Introducere în limbajul de programare C++

Cu toate acestea, o constantă de caractere specificată de secvența octală esc este supusă extinderii semnelor și poate deveni un număr negativ; deci, de exemplu, „\377” are valoarea 1 .

Când un întreg lung este convertit într-un întreg scurt sau într-un char , acesta este trunchiat la stânga; biții în exces se pierd pur și simplu.

Plutește și dublează

Expresiile flotante pot efectua aritmetică în virgulă mobilă cu precizie unică. Conversiile între numerele cu precizie simplă și dublă sunt efectuate atât de corecte din punct de vedere matematic, pe cât permite hardware-ul.

Plutitor și întreg

Conversiile de tip flotant în integral tind să fie dependente de mașină. În special, direcția de trunchiere a numerelor negative variază de la mașină la mașină. Dacă spațiul oferit pentru valoare este insuficient, rezultatul este nedefinit.

Conversia unei valori integrale într-un tip float funcționează bine. Dacă implementarea hardware nu are biții necesari, apare o oarecare pierdere de precizie.

Indicatori și numere întregi

O expresie de tip întreg poate fi adăugată sau eliminată dintr-un pointer; într-un astfel de caz, primul este transformat, așa cum este indicat în discuția despre operația de adunare.

Puteți efectua scăderea peste două pointeri către obiecte de același tip; în acest caz rezultatul este convertit la tipul int sau long în funcție de mașină.

Ori de câte ori se combină un întreg fără semn și un întreg obișnuit, întregul obișnuit este convertit în tipul nesemnat și rezultatul este de tip nesemnat.

Valoarea este cel mai mic număr întreg fără semn egal cu un număr întreg cu semn (mod 2** (dimensiunea cuvântului)) (adică mod2** (dimensiunea cuvântului)). În reprezentarea binară complement, această conversie este goală și nu are loc nicio schimbare reală în reprezentarea binară.