Limbajul C
De la Wikipedia, enciclopedia liberă
![The C Programming Language - Limbajul de programare C, de Brian Kernighan şi Dennis Ritchie, ediţia originală ce a servit pentru mulţi ani ca manual de referinţă al limbajului C.](../../../upload/thumb/4/48/K%26R_C.jpg/180px-K%26R_C.jpg)
C este un limbaj de programare standardizat, compilat, de nivel mediu. Este implementat pe marea majoritate a platformelor de calcul existente azi, şi este cel mai popular limbaj de programare pentru scrierea de software de sistem. Este apreciat pentru eficienţa codului obiect pe care îl poate genera, şi pentru portabilitatea sa.
A fost dezvoltat la începutul anilor 1970 de Ken Thompson şi Dennis Ritchie, care aveau nevoie de un limbaj simplu şi portabil pentru scrierea nucleului sistemului de operare UNIX.
Sintaxa limbajului C a stat la baza multor limbaje create ulterior şi încă populare azi: C++, Java, JavaScript, C#.
Cuprins |
[modifică] Generalităţi C
[modifică] Scurtă introducere în C
C este un limbaj de programare relativ minimalist ce operează în strânsă legătură cu hardware-ul, fiind cel mai apropiat de limbajul de asamblare faţă de marea majoritate a celorlalte limbaje de programare. Întradevăr, C este prezentat uneori ca "asamblor portabil", făcându-se astfel diferenţele principale faţă de limbajele de asamblare: codul unui program C poate fi compilat şi rulat pe aproape orice tip de maşină, în comparaţie cu alte limbaje de programare, în timp ce limbajele de asamblare sunt specifice unui model specific de maşină. Limbajul C este plasat în clasa limbajelor de nivel scăzut sau de nivel mediu, indicând cât de strânsă este legătura de interoperabilitate cu echipamentul hardware.
Nu este un accident; C a fost creat având un scop important: de a face ca programele mari să poată fi scrise mai uşor şi cu mai puţine erori în paradigma programării procedurale, dar fără a pune un obstacol în scrierea compilatorului de C, care este încărcat de caracteristicile complexe ale limajului. În concluzie, C are urmatoarele caracteristici importante:
- Este un limbaj de bază simplu, cu importante funcţionalităţi cum ar fi funcţiile matematice sau cele de manipulare ale fişierelor
- Este focalizat pe paradigma programării procedurale, care facilitează programarea într-un mod structurat
- Utilizează un set simplu de tipuri de date ce previne multe operaţii neintenţionate
- Foloseşte un limbaj preprocesor, preprocesorul C, pentru sarcini cum ar fi definirea de macrouri şi includerea mai multor fişiere sursă
- Permite accesarea la nivel scăzut a memoriei calculatorului prin utilizarea pointerilor
- Permite folosirea parametrilor care sunt pasaţi funcţiilor prin valoare, şi nu prin referinţă
- Pointeri la funcţii, ce permit forme rudimentare de closure şi polimorfism
- Declarea variabilelor
- Strucuri de date sau tipuri de date agregate definite de utilizator (
struct
) ce permite ca date înrudite să fie combinate şi manipulate ca un întreg
Printre caracteristicile ce lipsesc în C dar care pot fi regăsite în alte limbaje de programare se enumeră:
- Un sistem automat de colectare a reziduurilor
- Clasele şi obiectele (programarea orientată pe obiecte)
- Un sistem avansat de tipuri de date
- Programarea generică
- Supraîncărcarea
- Metaprogramarea
- Suport nativ pentru programarea multifir şi funcţiile de reţea
- Procesarea listelor
Deşi lista minusurilor limbajului C este destul de lungă, aceasta nu reprezintă un dezavantaj important pentru a face limbajul C să nu fie acceptat în practică, deoarece permite ca noi compilatoare să poată fi scrise pe noi tipuri de platforme şi pentru că permite programatorului să ţină bine sub control programul pe care îl scrie. Acesta este unul din motivele care face ca un cod scris în C să fie mult mai eficient decât dacă ar fi scris în alte limbaje de programare. În mod normal numai un cod scris într-un limbaj de asamblare, cu foarte mare grijă să poată fi mai performant, deoarece are control integral asupra maşinii, dar performanţa avansată a compilatoarelor, combinată cu complexitatea noilor tipuri de procesoare, au făcut ca limbajul C să fie preferat şi să fie acceptat din ce în ce mai mult de programatori.
Una din consecinţele acceptării şi eficienţei C-ului este acela că multe compilatoare, biblioteci şi interpretoare ale limbajelor de nivel înalt sunt adesea implementate în C.
[modifică] Un exemplu de program C: "Hello, World!"
Următorul exemplu de program a apărut în prima ediţie a cărţii lui Brian Kernighan şi Dennis Ritchie, şi a devenit un exemplu standard de program introductiv în marea majoritate a cărţilor de programare, indiferent de limbajul de programare. Programul afişează „Hello World!“ la ieşirea standard, care este de obicei un terminal sau monitor. Poate să fie totuşi şi un fisier sau alt dispozitiv hardware, depinzând cum a fost mapată ieşirea standard în momentul execuţiei programului.
#include <stdio.h> main() { printf("Hello, World!\n"); }
Programul prezentat mai sus va fi compilat corect de marea majoritate a compilatoarelor moderne. Totuşi, va produce unele mesaje de avertizare dacă va fi compilat de un compilator ce respectă standardul ANSI C. Mai mult, codul nu va fi compilat, returnând mesaje de eroare dacă compilatorul va respecta strict standardele C99, deoarece variabila de întors de tip int
nu va putea fi dedusă dacă nu a fost specificată în codul sursă. Aceste mesaje pot fi eliminate, aducând câteva schimbări minore programului original:
#include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; }
Urmează o discuţie linie cu linie a programului prezentat mai sus:
#include <stdio.h>
Prima linie a programului reprezintă o directivă preprocesor, #include
. Aceasta face ca preprocesorul—primul utilitar ce examinează codul sursă când acesta este compilat—pentru a substitui linia respectivă cu conţinutul unui fişier sau al entităţii la care se face referire. În acest caz, fişierul header stdio.h
—care conţine definiţiile funcţiilor intrării şi ieşirii standard—va înlocui acea linie. Parantezele unghiulare ce cuprind stdio.h
indică că acel fişier poate fi găsit într-una din locaţiile date preprocesorului prin search path (caută calea) fişierelor header (aceste fişiere se află în directorul "include/" al platformei respectiv compilatorului folosit).
int main(void)
Următoarea linie indică faptul că funcţia numită main
este definită. Funcţia main
are un loc bine definit în programele C. Când un program C este executat, aceasta este prima metodă executată. Metoda main
este obligatorie ca un program să fie executat. Porţiunea de cod int
indică faptul că funcţia de întoarcere—valoare pe care funcţia main
o va întoarce—este un întreg. (void)
indică faptul că funcţia main
nu primeşte nici un argument ori de câte ori este apelată.
{
Paranteza acoladă deschisă indică începutul codului pentru funcţia main
.
printf("Hello World\n");
Aceasta linie apelează—caută şi execută codul—funcţia printf
, care a fost definită în fişierul header stdio.h
. În cadrul acestui apel, funcţiei printf
îi este pasat un singur argument, şirul de caractere "Hello, World!\n"
. Secvenţa \n
este denumită secvenţă escape care se traduce prin caracterul EOL—end-of-line (sfârşitul liniei)—, pentru a muta cursorul pe linia următoare. Valoarea de întoarcere a funcţiei printf
este un întreg int
, dar nu este folosită în acest caz.
return 0;
Această funcţie termină execuţia codului funcţiei main
şi face ca aceasta să întoarcă valoarea 0 procesului apelant, în cazul acesta sistemului de operare.
}
Paranteza acoladă închisă indică că aici se termină codul pentru funcţia main
.
Compatibilitatea totală cu alte compilatoare care respectă standardul C99 poate fi insă atinsă prin următorul cod:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Hello world!\n"); return EXIT_SUCCESS; }
Constanta EXIT_SUCCESS
este definită în headerul stdlib.h
de aceea am fost nevoiţi să îl includem. Pe majoritatea platformelor această constantă are valoarea zero.
[modifică] Tipuri de date
C are un sistem de tipuri de date similar cu cel al descendenţilor ALGOL cum ar fi Pascal, dar totuşi cu anumite diferenţe. Cuprinde tipuri de date cum ar fi întregi de diferite dimensiuni cu sau fără semn, numere în virgulă mobilă, enumerări (enum
), structuri de date (struct
) şi uniuni (union
).
C utilizează foarte mult pointerii, un tip de referinţă foarte simplu care păstrează adresa locaţiei din memorie. Adresa poate fi manipulată cu ajutorul atribuirilor şi a aritimeticii pointerilor. În momentul rulării unui program, un pointer reprezintă o adresă de memorie. În momentul compilării, un pointer este un tip de dată complex ce reprezintă atât adresa de memorie cât şi tipul de dată. Acest lucru permite expresiilor ce utilizează pointeri să fie evaluate după tipul de dată. Pointerii au mai multe utilizări în C. De exemplu, şirurile de caractere (text string) sunt adesea reprezentate printr-un pointer la un vector de caractere. Alocarea dinamică a memoriei este realizată tot cu ajutorul pointerilor.
Un pointer null are o valoare rezervată indicând faptul că face referire la o locaţie nevalidă. Acest lucru este folositor în cazuri speciale cum ar fi pointerul next (următorul) în nodul final al unei liste înlănţuite. Dereferenţierea unui pointer null poate cauza un comportament nepredictibil al aplicaţiei. De asemenea, există şi pointeri de tip void
, fapt ce indică că aceştia fac referire la un obiect de tip necunoscut. Aceşti pointeri sunt foarte folositori în programarea generică. Deoarece dimensiunea şi tipul obiectelor la care acest tip de pointeri face referire sunt necunoscute, aceştia nu pot fi dereferenţiaţi, dar pot fi convertiţi la alt tip de pointeri.
În C, tablourile sunt de dimensiune fixă, statică cunoscută la momentul compilării; în practică acest lucru nu reprezintă o piedică, având în vedere că se pot aloca blocuri de memorie în momentul rulării, tratându-le ca pe tablouri utilizând librăria standard. Spre deosebire de multe alte limbaje de programare, C reprezintă tablourile ca şi pe pointeri: o adresă şi un tip de dată. Prin urmare, valorile index pot depăşi dimensiunea actuală a unui tablou.
De asemenea, C oferă posibilitatea de lucru cu tablouri multidimensionale. Din punct de vedere semantic tablourile multidimensionale sunt tablouri de tablouri, dar din punct de vedere fizic acestea sunt stocate ca un singur tablou unidimensional cu un offset calculat.
C este adesea folosit în programarea de nivel scăzut, unde poate fi necesar ca un întreg să fie tratat ca o adresă de memorie, un număr în virgulă mobilă ca un întreg sau un tip de pointer ca un alt tip de pointer. Pentru astfel de cazuri C oferă operatorul de casting, care forţează explicit conversia unei valori dintr-un tip de dată în alt tip de dată.
[modifică] Alocarea memoriei
Una din cele mai importante funcţii ale unui limbaj de programare este ca acesta să furnizeze metode de management a memoriei şi al obiectelor stocate în memorie. C furnizează trei metode distincte de alocare a memoriei pentru obiecte:
- Alocarea statică a memoriei: adresele şi dimensiunile obiectelor ce fac uz de alocarea statică a memoriei sunt fixate în momentul compilării şi pot fi plasate într-o zonă de dimensiune fixă ce corespunde unei secţiuni din cadrul fişierului linkedidat final. Acest tip de alocare a memoriei se numeşte statică deoarece locaţia şi dimensiunea lor nu variază pe durata de execuţie a programului.
- Alocarea automată a memoriei: obiectele temporare (variabilele locale declarate în cadrul unui bloc de cod) sunt stocate în memorie, iar spaţiul alocat este automat eiberat şi reutilizat după ce s-a părăsit blocul în care acestea au fost declarate.
- Alocarea dinamică a memoriei: blocuri de memorie de orice dimensiune pot fi alocate într-o zonă de memorie numită heap prin intermediul funcţiilor
malloc()
,realloc()
şifree()
. Aceste blocuri de memorie pot fi reutilizate după ce zona de memorie a fost eliberată prin apelul funcţieifree()
.
Nu toate variabilele sunt automat alocate. Următoarele tipuri de variabilă sunt alocate static:
- toate variabilele globale, indiferent dacă au fost sau nu declarate ca statice;
- variabilele locale declarate explicit ca fiind statice.
Variabilele alocate static au alocată locaţia lor de memorie şi iniţializată înainte ca funcţia main
să fie executată şi nu sunt dealocate până când se termină execuţia funcţiei main
. Variabilele alocate static nu sunt reiniţializate la fiecare apel al funcţiei în cadrul cărora au fost declarate. O variabilă alocată static are avantajul să îşi păstreze valoarea chiar dacă funcţiile care accesează acea valoare nu mai sunt active.
Acolo unde este posibil, alocarea automată sau statică este preferată deoarece alocarea memoriei este coordonată de compilator, nemaifiind nevoie ca programatorul să aloce iar apoi să elibereze memoria - operaţie ce adesea generează erori. Totuşi, multe structuri de date sunt variabile în dimensini şi deoarece alocarea automată şi cea statică trebuie să fie de dimensiune fixă în momentul compilării, sunt multe situaţii în care alocarea dinamică trebuie folosită. Un exemplu ar fi tablourile de dimensiuni variabile.
[modifică] Sintaxa
- Vezi şi Sintaxa limbajului C
Spre deosebire de alte limbaje de programare cum ar fi Fortran 77, C-ul are o formă liberă, lăsând programatorul să-şi organizeze codul folosind spaţiile albe. Comentarii pot fi înserate oriunde în cadrul programului utilizând delimitatorii /*
şi */
.
Fiecare fişier sursă conţine declaraţii de variabile şi definiţii de funcţii. Funcţiile, la rândul lor, conţin alte declaraţii de variabile şi comenzi. Declaraţiile de variabile fie definesc noi tipuri folosind cuvinte cheie precum struct
, union
şi enum
sau atribuind un tip de date predefinite, prin scrierea tipului de dată şi urmat de numele variabilei. Cuvinte cheie precum char
, int
, precum şi pointerul la unul din aceste tipuri *
reprezintă tipuri de date implementate nativ în C. Secţiuni de cod sunt incluse între paranteze acolade ({
şi }
) pentru a indica pentru ce porţiune a codului se aplică declaraţiile de variabile şi celelalte structuri de control.
Comenzile execută acţiuni cum ar fi cele de modificare ale valorii unei variabile sau afişarea unui text la consolă. Structurile de control sunt variabile pentru execuţii condiţionale sau iteraţii, realizate cu ajutorul cuvintelor rezervate if
, else
, switch
, do
, while
şi for
. Salturi arbitrare sunt posibile prin folosirea cuvântului cheie goto
. Cu ajutorul unei varietăţi de operatori implementaţi în C se pot realiza operaţii aritmetice, logice, comparative, pe biţi, indexarea tablourilor şi atribuiri. Comenzile pot de asemenea apela funcţii, incluzând un număr mare de funcţii din bibliotecile standard ale limbajului C, necesare pentru realizarea diferitelor sarcini cerute de programator.
[modifică] Istoric
[modifică] Începuturile limbajului de programare C
Etapa iniţială de dezvoltare a limbajului de programare C a avut loc în cadrul laboratoarelor AT&T Bell între anii 1969 şi 1973. După spusele lui Dennis Ritchie, cea mai creativă perioadă a avut loc în 1972. A fost denumit „C“ deoarece multe din caracteristicile sale au fost derivate din limbajul de programare „B“.
Sunt multe legende despre originea limbajului C şi legătura sa cu sistemul de operare Unix, cum ar fi:
- Dezvoltarea limbajului C a fost rezultatul dorinţei programatorilor de a juca un joc de tipul Asteroids. Aceştia îl jucau pe calculatorul principal al companiei, dar din lipsa de resurse şi datorită faptului că acesta trebuia să suporte mai mult de 100 de utilizatori, Thompson şi Ritchie, nemulţumiţi de controlul pe care îl aveau asupra navei în încercarea de a evita asteroizii, au decis să porteze jocul pe un PDP-7, nefolosit, din birou. Dar această maşină nu avea un sistem de operare, aşa că au hotărât să scrie unul. Au decis ca eventual să porteze acest sistem de operare pe maşinile PDP-11 pe care aceştia le foloseau în birou, dar era o muncă destul de dificilă având în vedere că totul era scris în limbaj de asamblare. Aşa că au decis să folosească un limbaj portabil de nivel înalt astfel încât sistemul de operare să poată fi portat cu uşurinţă de pe un computer pe altul. Au încercat folosind limbajul de programare B, dar îi lipseau unele din funcţionalităţile care ar fi făcut facilă folosirea unor caracteristici avansate a maşinii PDP-11. Astfel, a apărut un nou limbaj de programare, numit C.
- Justificarea pentru obţinerea primului computer care a fost utilizat pentru dezvoltarea sistemului de operare Unix a fost acela de a crea un sistem pentru a automatiza completarea autorizaţiilor. Prima versiune a sistemului de operare Unix a fost scrisă în limbaj de asamblare. Mai târziu, limbajul de programare C a fost folosit pentru a rescrie sitemul de operare.
Începând cu anul 1973, limbajul de programare C a devenit destul de robust, astfel încât mare parte a kernelului Unix, scris iniţial în limbaj de asamblare pentru PDP 11/20, a fost rescris în C. Acesta a fost unul din primele kernele ale unui sistem de operare scris într-un limbaj de programare, altul decât limbajul de asamblare. Încercări anterioare au fost pentru scrierea sistemului Multics (scris în PL/I) şi TRIPOS (scris în BCPL).
[modifică] K&R C
În 1978, Dennis Rithie şi Brian Kernighan au publicat prima ediţie a cărţii Limbajul de programare C (eng. The C Programming Language). Această carte, cunoscută în cercul programatorilor sub numele K&R, a servit pentru mulţi ani ca un mijloc de informare asupra specificaţiilor limbajului C. Versiunea limbajului C descrisă este cunoscută sub numele K&R C.
K&R aduce în discuţie următoarele caracteristici ale limbajului:
- Tipul de dată
struct
- Tipul de dată
long int
- Tipul de dată
unsigned int
- Operatorul
=+
a fost schimbat în+=
, precum şi ceilalţi operatori înrudiţi (=+
producea confuzii analizorului lexical al compilatorului limbajului C; de exemplu:i += 10
comparat cui = +10
).
K&R C este adesea considerat limbajul de bază pe care orice compilator C trebuie să-l suporte. Pentru mulţi ani, chiar şi după introducerea standardului ANSI C, a fost considerat ca fiind „cel mai mic numitor comun“ pe care programatorii în C trebuie să-l respecte atunci când se vorbeşte de portabiliitate maximă, deoarece nu toate compilatoarele sunt scrise încă să suporte standardul ANSI C, iar o secvenţă de cod scrisă în K&R C respectă şi ANSI C.
În primele versiuni C, numai funcţiile care returnau o valoare non-integer trebuiau să fie definite sau declarate înainte de folosire. Despre o funcţie folosită fără ca aceasta să fi fost declarată în prealabil se presupunea că întoarce un întreg. Parametrii funcţiilor nu erau verificaţi după tip, totuşi unele compilatoare afişau un mesaj de atenţionare dacă o funcţie era apelată cu un număr greşit de argumente.
În anii ce au urmat publicaţiei K&C R, câteva caracteristici „neoficiale“ au fost adăugate limbajului C, fiind suportate de compilatoarele celor de la AT&T, precum şi de alţi producători. Acestea includ:
- funcţiile
void
şi tipul de datevoid *
- funcţiile care întorc tipul
struct
sauunion
- numele câmpurilor unei structuri
struct
într-un spaţiu de nume pentru fiecare tip de structură - atribuirea pentru tipurile de date de tip
struct
- calificatorul
const
pentru a face un obiect de tip „read only“ - o bibliotecă standard încorporând funcţii implementate de diverşi dezvoltatori
- enumeraţiile
- tipul
float
în precizie simplă.
[modifică] ANSI C şi ISO C
La sfârşitul anilor 1970, C a început să înlocuiască limbajul BASIC devenind cel mai utilizat limbaj de programare. În anii 1980 a fost adoptat şi de calculatoarele IBM PC, popularitatea acestuia începând să crească semnificativ. În acest timp, Bjarne Stroustrup împreună cu alţi colegi de la Bell Labs au început să adauge limbajului C caracteristici ale programării orientate pe obiecte. Limbajul rezultat a fost denumit C++ şi este cel mai popular limbaj de programare pe sistemele de operare Microsoft Windows; totuşi C-ul rămâne cel mai popular limbaj de programare în Unix. Alt limbaj de programare dezvoltat în acea vreme se numeşte Objective-C care adaugă de asemenea C-ului caracteristici ale programării orientate pe obiecte. Deşi nu la fel de popular ca C++, Obejective-C este folosit pentru dezvoltarea aplicaţiilor pe ce folosesc interfaţa Cocoa a sistemului de operare Mac OS X.
În 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a stabili specificaţiile unui limbaj C standard. După un proces îndelungat, standardul a fost terminat în 1989 şi ratificat ca ANSI X3.159-1989 "Programming Language C". Această versiune a limbajului ne este cunoscută sub numele ANSI C. în 1990, standardul ANSI C (cu mici modificări) a fost adoptat de International Organization for Standardization (ISO) ca ISO/IEC 9899:1990.
Una din ţintele procesului de standardizare ANSI C a fost acela de a produce un superset al K&R C, încorporând multe dintre caracteristicile neoficiale introduse secvenţial. Totuşi, comitetul pentru standardizare a introdus câteva caracteristici noi, cum ar fi prototipul funcţiilor (împrumutat din C++) şi un preprocesor mult mai capabil.
ANSI C este suportat de marea majoritate a compilatoarelor folosite astăzi. Mare parte din codul C scris acum este bazat pe ANSI C. Orice program scris exclusiv în standardul C este garantat să funcţioneze corect pe orice platformă cu o implementare C conformă. Totuşi, multe programe sunt scrise astfel încât aceste vor putea fi compilate numai pe anumite platforme, sau folosind un anumit compilator, deoarece (i) se folosesc biblioteci non-standard, de exemplu pentru interfaţa grafică, (ii) unele compilatoare ce nu respectă standardul ANSI C, deci şi urmaşii lor în mod implicit sau (iii) bazarea pe dimensiunea unui anumit tip de date pe anumite platforme.
[modifică] C99
După procesul de standardizare ANSI, specificaţiile limbajului de programare C au rămas nemodificate pentru o perioadă, în timp ce C++ a continuat să evolueze. (Amendamentul Normativ I a creat o nouă versiune a limbajului C în 1995, dar această versiune este prea puţin cunoscută.) Totuşi, la sfârşitul anilor 1990, standardul a suferit o revizie, conducând la publicarea standardului ISO 9899:1999 în anul 1999. Acest standard este cunoscut sub numele „C99“. A fost adoptat ca standard ANSI în martie 2000.
Noile aspecte ale limbajului C includ:
- funcţii inline
- variablele pot fi declarate oriunde în cadrul unui program (la fel ca şi în C++)
- câteva noi tipuri de date, incluzând şi
long long int
(pentru a reduce efortul legat de tranziţia de la 32-biţi la 64-biţi), un tip explicit de date boolean şi un tip complex de date reprezentând numerele complexe - tablourile de dimensiuni variabile
- suport pentru comentariile pe o singură linie, marcate la început de
//
, ca şi în BCPL sau C++ şi care au fost suportate de multe compilatoare ca o extensie a limbajului C - noi funcţii, cum ar fi
snprintf()
- noi fişiere header, cum ar fi
stdint.h
În ceea ce priveşte interesul în adoptarea noului standard C99, dacă GCC şi alte compilatoare suportă noile caracteristici C99, compilatoarele celor de la Microsoft şi Borland nu suportă C99 şi cele două companii nu par interesate în a oferi nici un fel de suport.
[modifică] Diferenţe între C, C++ şi Pascal
[modifică] Comparaţie cu limbajul Pascal
Sintaxa Pascal | Sintaxa C şi C++ | Explicaţii |
begin |
{ |
Început bloc |
end. / end |
} |
Sfârşit bloc |
if (<cond>) then |
if(<cond>) |
Instrucţiune condiţională |
while(<cond>) do |
while(<cond>) |
Repetă până când |
a<> b |
a!=b |
Valoarea variabilei a e diferită de valoarea variabilei b |
for i:=1 to n do |
for(i=1;i<=n;i++) |
For |
i:=a; |
i=a; |
Atribuire |
i:=i+1 |
i++; |
Incrementare |
i:=i-1 |
i--; |
Decrementare |
var i: integer |
int i; |
Declarare variabilă (în C++ se poate declara oriunde în program/ funcţie) |
if(a=b) then |
if(a==b) |
Dacă a egal cu b |
read(var); |
cin>>var; |
Citire de la intrarea standard (de obicei tastatură) |
write('text', var); |
cout<<"text"<<var; |
Scriere la ieşirea standard (de obicei ecran) |
writeln; |
cout<<endl; |
Tipăreşte o linie nouă |
[modifică] C şi C++
Limbajul de programare C++ a fost iniţial derivat din C. Totuşi, nu absolut orice program scris în C este valid C++. Deoarece C şi C++ au evoluat independent, au apărut, din nefericire, o serie de incompatibilităţi între cele două limbaje de programare [1]. Cea mai amplă revizie a limbajui C, C99, a creat un număr suplimentar de conflicte. Diferenţele fac să fie greu de scris programe şi biblioteci care să fie compilate şi să ruleze corect în calitate de cod C sau C++, şi produce confuzii celor care programează în ambele limbaje. Diferenţele fac ca fiecare din cele două limbaje de programare să împrumute din caracteristicile celuilalt limbaj de programare.
Bjarne Stroustrup, creatorul limbajului C++, a sugerat de nenumărate ori [2] să se reducă incompatibilităţile pe cât de mult posibil pentru a maximiza interoperabilitatea dintre cele două limbaje de programare. Unii au argumentat că C şi C++ sunt două limbaje de programare distincte, compatibilitatea dintre ele fiind utilă dar nu vitală; potrivit acestei opinii, eforturile de a reduce incompatibilitatea nu trebuie să reducă eforturile de a aduce elemente noi în mod independent celor două limbaje de programare.
Cele mai importante diferenţe sunt:
inline
—funcţiile inline apar în secţiunea de declarare a variabilelor globale în C++, iar in C acestea apar în aşa zisele „fişiere statice“.- Cuvântul cheie
bool
are în C99 propriul său header,<stdbool.h>
. În variantele anterioare de C tipul de date boolean nu era definit, în schimb erau folosite o serie de metode (incompatibile) pentru a simula acest tip de date. - Constantele caracter (cuprinse între apostoafe) au dimensiunea unui
int
în C şichar
în C++. Cu alte cuvinte, în C,sizeof('a') == sizeof(int)
; în C++,sizeof('a') == sizeof(char)
. Chiar şi în aceste condiţii, valoarea acestui tip de constante nu va depăşi valoarea maximă ce poată fi păstrată dechar
, deci o conversie de genul(char)'a'
este sigură. - Cuvinte cheie suplimentare au fost introduse în C++, deci acestea nu pot fi folosite ca identificatori aşa cum ar putea fi folosite în C. (de exemplu, code>try,
catch
,template
,new
,delete
, ...) - În C++, compilatorul crează automat o „etichetă“ pentru orice structură (
struct
), uniune (union
) sau enumeraţie (enum
), astfel încâtstruct S {};
în C++ este echivalent cutypedef struct S {} S;
în C.
C99 a adoptat unele funcţionalităţi ce au apărut iniţial în C++. Printre acestea se enumeră:
- Declararea obligatorie a prototipului funcţiilor
- Cuvântul cheie
inline
- Eliminarea variabilei implicite int ca valoare de întoarcere.
[modifică] Exemplu
Un program care citeşte un număr întreg şi îl afişează.
Pascal:
program test; var i:integer; begin writeln('introduceti un nr:'); read(i); end.
C:
#include <stdio.h> // contine declaratiile functiilor de intrare/iesire int main() // program principal { int i; printf("Introduceti un nr:"); scanf("%d",&i); //citire return 0; }
C++:
#include <iostream> // contine declaratiile functiilor de intrare/iesire int main() // program principal { int i; std::cout<<"Introduceti un nr:"; std::cin>>i; //citire return 0; }