Documente Academic
Documente Profesional
Documente Cultură
Limbaje de programare
Limbajul C istoric i caracteristici
Dezvoltarea de programe C
Structura programelor C
Elemente de baz ale limbajului C
Tipuri de date i constante
Variabile i operatori
Expresii
nainte de prezentarea sintaxei i a elementelor de baz ale limbajului C, vom descrie, pe scurt,
istoricul i caracteristicile limbajului C. Limbajul C este un limbaj de baz pentru programatorii
profesioniti. Are caracteristicile limbajelor de nivel nalt, fiind ns mult mai flexibil, aspect care
poate fi exploatat de programatorii experimentai.
Limbaje de programare
Limbajul main este limbajul pe care computerul l nelege n mod direct; n acest limbaj
programele se scriu n cod binar ca succesiuni de 0 i 1, fiecare instruciune din limbajul main
fiind o combinaie de 4 bii (exemple: LOAD-0000, ADD-0001). Pentru aceasta programatorul
trebuie s cunoasc detaliat structura hardware a computerului, trebuie s gestioneze fr
greeal alocarea adreselor de memorie pentru un program. Pot aprea multe erori datorate
concepiei programului, sintaxei, suprapunerii adreselor de memorie, etc.
n plus fa de limbajul main, la nivelul limbajului de asamblare, apar mnemonice pentru
operaiuni i simboluri pentru adrese.
Limbajul de asamblare presupune existena unui program numit assembler (asamblor) care s
traduc programele n limbaj main. Asamblorul nlocuiete codarea mnemonic (cum ar fi
ADD) cu coduri binare corespunztoare limbajului main i aloc adrese de memorie pentru
toate variabilele simbolice utilizate (A, B, C) i se asigur c aceste adrese sunt distincte. Astfel
prin uurarea procesului de programare s-a introdus un nou nivel de procesare pentru
computer. Astzi limbajele de asamblare sunt nc utilizate pentru unele programe critice
deoarece aceste limbaje confer programatorului un control foarte precis a ceea ce se ntmpl
n computer.
Ideea programrii orientate pe obiecte este aceea de a crea programele sub forma unei colecii
de obiecte, uniti individuale de cod, care interacioneaz unele cu altele, n loc de simple liste
de instruciuni sau de apeluri de proceduri aa cum apare n programarea structurat.
Obiectele POO sunt de obicei reprezentri ale obiectelor din viaa real, astfel nct programele
realizate prin tehnica POO sunt mai uor de neles, de depanat i de extins dect programele
procedurale. Aceasta este adevrat mai ales n cazul proiectelor software complexe i de
dimensiuni mari, care se gestioneaz fcnd apel la ingineria programrii.
Limbajul C a fost proiectat i implementat de Dennis Ritchie ntre anii 1969 i 1973 la AT&T Bells
Laboratories, pentru programe de sistem (care pn atunci erau dezvoltate doar n limbaje de
asamblare). A fost numit C deoarece este un succesor al limbajului B, limbaj creat de Ken
Thompson.
Originile limbajului C sunt strns legate de cele ale UNIX-ului, care iniial fusese implementat n
limbajul de asamblare PDP-7 tot de Ritchie i Thompson. Deoarece limbajul B nu putea folosi
eficient unele din facilitile PDP-11, pe care vroiau s porteze UNIX-ul, au avut nevoie de un
limbaj simplu i portabil pentru scrierea nucleului sistemului de operare UNIX.
n 1973, sistemul de operare UNIX este aproape n totalitate rescris n C, fiind astfel unul
din primele sisteme de operare implementate n alt limbaj dect cel de asamblare.
Cartea de referin care definete un standard minim este scris de Brian W. Kernighan
i Dennis Ritchie, "The C Programming Language" i a aprut n 1978 (Prentice Hall).
ntre 1983-1989 a fost dezvoltat un standard international -- ANSI C (ANSI - American
National Standards Institute).
n 1990, ANSI C standard a fost adoptat de International Organization for
Standardization (ISO) ca ISO/IEC 9899:1990, care mai este numit i C90. Acest standard
este suportat de compilatoarele curente de C. Majoritatea codului C scris astzi are la
baz acest standard. Orice program scris doar n ANSI C Standard va rula corect pe orice
platform ce are instalat o variant de C.
n anii urmtori au fost dezvoltate medii de programare C performante sub UNIX i DOS,
care au contribuit la utilizarea masiv a limbajului.
Necesitatea gruprii structurilor de date cu operaiile care prelucreaz respectivele date
a dus la apariia noiunilor de obiect sau clas, n 1980, Bjarne Stroustrup elaboreaz C
with Classes.
Acest limbaj a dus la mbuntirea C-ului prin adugarea unor noi faciliti, printre care
i lucrul cu clase. n vara 1983, C-with-classes a ptruns i n lumea academic i a
instituiilor de cercetare. Astfel, acest limbaj a putut s evolueze datorit experienei
acumulate de ctre utilizatorii si. Denumirea final a acestui limbaj a fost C++.
Succesul extraordinar pe care l-a avut limbajul C++ a fost asigurat de faptul c a extins
cel mai popular limbaj al momentului, C.
Programele scrise n C funcioneaz i n C++, i ele pot fi transformate n C++ cu eforturi
minime.
Cea mai recent etap n evoluia acestui limbaj o constituie limbajul JAVA (1995)
realizat de firma SUN, firm cumprat n 2010 de ctre Oracle.
n concluzie, sintaxa limbajului C a stat la baza multor limbaje create ulterior i nc populare
azi: C++, Java, JavaScript, C#.
Caracteristicile limbajului C
Secvenial
Instruciune 1
Instruciune 2
.
.
.
Instruciune n
Un program are un caracter general i de aceea are nevoie de date iniiale care particularizeaz
programul pentru o situaie concret. Rezultatele produse de un program pe baza datelor
iniiale sunt de obicei afiate pe ecran. Datele de intrare se introduc manual de la tastatur sau
se citesc din fiiere disc.
Operaiile uzuale din limbajele de programare sunt operaii de prelucrare (calcule, comparaii
etc) i operaii de intrare-ieire (de citire-scriere). Aceste operaii sunt exprimate prin
instruciuni ale limbajului sau prin apelarea unor funcii standard predefinite (de bibliotec).
Desfurarea n timp a instruciunilor de prelucrare i de intrare-ieire este controlat prin
instruciuni repetitive (de ciclare) i de decizie (de comparaie).
Fiecare limbaj de programare are reguli gramaticale precise, a cror respectare este verificat
de programul compilator (translator).
Pentru a dezvolta un program C putem folosi un mediu integrat de dezvoltare (IDE - Interactive
Development Environment) precum CodeBlocks, DevCpp, MS Visual Studio, Eclipse sau
Netbeans, sau o putem face n mod linie de comand.
n Windows (CMD shell) - Rulare "Hello.exe" (.exe este opional) > Hello
n Unix or Mac (Bash shell) - Rulare "Hello" $ ./Hello
Detaliarea acestor etape este reflectat n figura urmtoare: n stnga avem tipul de fiiere, la
mijloc cine realizeaz acel pas, pentru ca n partea dreapt a figurii s apar paii efectivi:
Editor sau IDE Pas 1: Scriere cod surs
DATE IEIRE
Pas Descriere
1 Crearea fiierului surs (cu extensia .c sau .cpp n cazul limbajului C/C++) folosind
un editor de texte sau un IDE. Rezult un fiier surs. Poate fi creat i un fiier
antet (header), cu extensia .h
Pentru mai multe detalii vom include aici tutoriale de utilizare a unor medii integrate de
dezvoltare C:
Tutorial CodeBlocks
Tutorial NetBeans
O funcie C are un antet i un bloc de instruciuni (prin care se execut anumite aciuni) ncadrat
de acolade. n interiorul unei funcii exist de obicei declaraii de variabile precum i alte
blocuri de instruciuni.
Primul program C
Urmeaz un exemplu de program C minimal, ce afieaz un text Hello World! pe ecran.
Exemplul conine o funcie main cu o singur instruciune (apelul funciei printf) i nu conine
declaraii i este scris n trei variante diferite pentru funcia main:
Varianta Cod
1 #include<stdio.h>
void main(void)
{
printf(Hello World!);
}
Execuia programului ncepe cu prima linie din main. Cuvntul din faa funciei main reprezint
tipul funciei (void arat c aceast funcie nu transmite nici un rezultat prin numele su, int
arat c trimite un rezultat de tip ntreg, prin instruciunea return). Parantezele care urmeaz
cuvntului main arat c main este numele unei funcii (i nu este numele unei variabile), dar o
funcie fr parametri (acel void care poate lipsi varianta 2).
Acoladele sunt necesare pentru a delimita corpul unei funcii, corp care este un bloc de
instruciuni i declaraii. Funcia printf realizeaz afiarea pe ecran a textului Hello World!.
Directiva #include este o directiv de preprocesare, permite includerea unor funcii de
bibliotec, necesar pentru folosirea funciei printf.
Alte observaii care pot fi fcute:
cuvintele cheie sunt scrise cu litere mici
instruciunile se termin cu ';'
irurile de caractere sunt incluse ntre ghilimele
limbajul C este case sensitive face diferen ntre literele mici i literele mari ( a
este diferit de A )
\n folosit n funcia printf poziioneaz cursorul la nceputul liniei urmtoare
Alfabetul limbajului
Caracterele se codific conform codului ASCII (American Standard Code for Information
Interchange), codificarea realizndu-se pe 8 bii (un octet). Sunt 256 (codificate de la 0 la 255)
de caractere n codul ASCII, alfabetul cuprinznd simboluri grafice i simboluri fr
corespondent grafic.
De exemplu, caracterul A cu codul ASCII 65 este codificat pe 8 bii 1 octet astfel:
Puterea lui 2 76543210
Valoare 01000001
biti
Pentru a nelege mai bine ce nseamn mod de codificare urmtoarele noiuni auxiliare sunt
descrise n anexa Tutorial despre reprezentarea datelor.
Octet
reprezentare n baza 2, 8, 10, 16
Limbajul C este case-sensitive (se face diferen ntre litere mici i litere mari).
O alt observaie este aceea c spaiul are codul mai mic decat simbolurile grafice (32), iar
cifrele (n ordine cresctoare), literele mari i literele mici (n ordine alfabetic) ocup cte trei
zone compacte - cu intervale ntre ele.
Pentru mai multe detalii legate de codul ASCII v rugm s urmai unul din urmtoarele link-uri:
Tabel Coduri ASCII
Tabel Coduri ASCII 2
Un atom lexical trebuie scris integral pe o linie i nu se poate extinde pe mai multe linii. n
cadrul unui atom lexical nu se pot folosi spaii albe (excepie fac spaiile dintr-o constant ir),
putem ns folosi caracterul '_'.
Respectarea acestei reguli poate fi mai dificil n cazul unor iruri constante lungi, dar exist
posibilitatea prelungirii unui ir constant de pe o linie pe alta folosind caracterul '\'.
Un program este adresat unui calculator pentru a i se cere efectuarea unor operaii, dar
programul trebuie citit i neles i de ctre oameni; de aceea se folosesc comentarii care
explic de ce se fac anumite aciuni.
Iniial n limbajul C a fost un singur tip de comentariu, comentariul multilinie, care ncepea cu
secvena /* i se termina cu secvena */. Ulterior s-au adoptat i comentariile din C++, care
ncep cu secvena // i se termin la sfritul liniei care conine acest comentariu.
Identificatorii pot fi :
nume utilizator - nume de variabile, constante simbolice, funcii, tipuri,
structuri, uniuni - este bine sa fie alese ct mai sugestiv pentru scopul
utilizrii;
cuvinte cheie ale limbajului C - pot fi folosite doar cu nelesul cu care au
fost definite
cuvinte rezervate - nelesul poate fi modificat, de evitat acest lucru;
Recomandri:
Este important s alegem un nume care este self-descriptive, care reflect foarte bine
nelesul identificatorului respectiv, de exemplu, vom spune nrStudenti sau
numarDeStudenti.
ncercai s nu folosii identificatori care nu spun nimic (lipsii de un sens clar): a, b, c, d,
i, j, k, i1, j99.
Evitai numele de un singur caracter care sunt mai uor de folosit dar de cele mai multe
ori lipsite de vreun neles. Acest lucru este ns utilizat dac sunt nume commune cum
ar fi x, y, z pentru coordinate sau i, j pentru indici.
Nu folosii nume foarte lungi, sunt greu de utilizat, ncercai s optimizai lungimea
numelui cu nelesul acestuia.
Folosii singularul i pluralul pentru a diferenia. De exemplu, putem folosi numele linie
pentru a ne referi la numrul unei singure linii i numele linii pentru a ne referi la mai
multe linii (de exemplu un vector de linii).
Cuvintele cheie se folosesc n declaraii i instruciuni i nu pot fi folosite ca nume de variabile sau de
funcii (sunt cuvinte rezervate ale limbajului). Exemple de cuvinte cheie:
Numele de funcii standard (scanf, printf, sqrt etc.) nu sunt cuvinte cheie, dar nu se recomand utilizarea
lor n alte scopuri, deoarece aceasta ar produce schimbarea sensului iniial, atribuit n toate versiunile
limbajului.
Tipuri de date
n C exist tipuri de date fundamentale i tipuri de date derivate. Sunt prezentate mai jos principale
tipuri
de date i numrul de octei pe care acestea le ocup pe un sistem Unix de 32 de bii.
Pentru a utiliza eficient memoria i a satisface necesitile unei multitudini de aplicaii exist n
C mai multe tipuri de ntregi i respectiv de reali, ce difer prin memoria alocat i deci prin
numrul de cifre ce pot fi memorate i prin domeniul de valori.
Tipurile ntregi sunt: char , short , int , long , long long. Implicit toate numerele ntregi sunt
numere cu semn (signed), dar prin folosirea cuvntului cheie unsigned la declararea lor se poate
cere interpretarea ca numere fr semn. Utilizarea cuvintelor long sau short face ca tipul
respectiv s aib un domeniu mai mare, respectiv mai mic de valori.
Tipuri n virgul mobil (reale): Exist dou tipuri, float i double, pentru numere reale
reprezentate n virgul mobil cu simpl i respectiv dubl precizie. Unele implementri suport
i long double (numai cu semn). Trebuie semnalat faptul c nu toate numerele reale pot fi
reprezentate, ntruct memorarea valorilor reale, fiind realizat pe un numr anume de bii, nu
poate reine dect o parte dintre cifrele semnificative. Deci numai anumite valori reale au
reprezentarea exact n calculator, restul confundndu-se cu reprezentarea cea mai apropiat.
Caractere: Caracterele (exemplu 'a', 'Z', '0', '9') sunt codificate ASCII sub form de valori ntregi,
i pstrate n tipul char. De exemplu, caracterul '0' este 48 (decimal, adic n baza 10) sau 30H
(hexadecimal baza 16); caracterul 'A' este 65 (decimal) sau 41H (hexadecimal); caracterul 'a'
este 97 (decimal) sau 61H (hexadecimal). Se observ c tipul char poate fi interpretat ca i
character n codul ASCII sau ca un ntreg fr semn n domeniul 0 255.
Standardul C din 1999 prevede i tipul boolean _Bool (sau bool) pe un octet.
Reprezentarea intern i numrul de octei necesari pentru fiecare tip nu sunt reglementate de
standardul limbajului C, dar limitele fiecrui tip pentru o anumit implementare a limbajului pot
fi aflate din fiierul antet limits.h (care conine i nume simbolice pentru aceste limite -
INT_MAX i INT_MIN) sau utiliznd operatorul sizeof.
De obicei tipul int ocup 4 octei, iar valoarea maxim este de cca. 10 cifre zecimale pentru tipul
int. Depirile la operaii cu ntregi de orice lungime nu sunt semnalate dei rezultatele sunt
incorecte n caz de depire.
Reprezentarea numerelor reale n diferite versiuni ale limbajului C este mai uniform deoarece
urmeaz un standard IEEE de reprezentare n virgul mobil. Pentru tipul float domeniul de
valori este ntre 10E-38 i 10E+38 iar precizia este de 6 cifre zecimale exacte. Pentru tipul
double domeniul de valori este ntre 10E-308 i 10E+308 iar precizia este de 15 cifre zecimale.
Tabelul urmtor prezint dimensiunea tipic, valorile minim i respective maxim pentru
tipurile primitive (n cazul general). nc o dat, dimensiunea este dependent de
implementarea C folosit.
char Caracter 1
Numere (poate fi cu semn
ntregi sau fr semn,
depinde de
implementare)
Valorile ntregi se reprezint implicit n baza 10 i sunt de tipul signed care este acoperitor
pentru reprezentarea lor.
Pentru reprezentarea constantelor fr semn se folosete sufixul u sau U
Constant ntreag poate fi precedat de semnul plus (+) sau minus.
Se poate folosi prefixul '0' (zero) pentru a arta c acea valoare este reprezentat n
octal, prefixul '0x' pentru o valoare n hexadecimal i prefixul '0b' pentru o valoare
binar (n unele compilatoare).
Un ntreg long este identificat prin folosirea sufixului 'L' sau 'l'. Un long long int este
identificat prin folosirea sufixului 'LL'. Putem folosi sufixul 'U' sau 'u' pentru unsigned int,
'UL' pentru unsigned long, i 'ULL' pentru unsigned long long int.
Pentru valori constante de tip short nu e nevoie de sufix.
Exemple:
-10000 // int
65000 // long
32780 // long
32780u // unsigned int
1234; // Decimal
01234; // Octal 1234, Decimal 2322
0x1abc; // hexadecimal 1ABC, decimal 15274
0b10001001; // binar (doar n unele compilatoare)
12345678L; // Sufix 'L' pentru long
123UL; // int 123 auto-cast la long 123L
987654321LL; // sufix 'LL' pentru long long int
Valorile reale
Sunt implicit de tipul double; sufixul f sau F aplicat unei constante, o face de tipul float, iar l sau
L de tipul long double.
Un numr cu parte fracionar, ca 55.66 sau -33.442, este tratat implicit ca double.
O constanta real se poate reprezenta i sub forma tiinific.
Exemplu:
1.2e3 // 1.2*103
-5.5E-6 // -5.5*10-6
unde E denot exponentul puterii lui 10. Mantisa, partea de dinaintea lui E poate fi precedat
de semnul plus (+) sau minus (-).
mantisa - parte_intreag.parte_zecimala ( oricare din cele dou pri poate lipsi, dar nu
ambele )
exponent - eval_exponent sau Eval_exponent, unde val_exponent este un numr ntreg.
Valoarea constantei este produsul dintre mantisa si 10 la puterea data de exponent.
Valori caracter
Valorile de tip caracter se reprezint pe un octet i au ca valoare codul ASCII al caracterului
respectiv.
n reprezentarea lor se folosete caracterul apostrof : A (cod ASCII 65), b, +.
Pentru caractere speciale se folosete caracterul \.
Exemple:
\ - pentru apostrof
\\ - pentru backslash
Este greit: sau \
Tot aici intr i secvenele escape ce se pot scrie sub forma unei secvene ce ncepe cu \,
Constantele caracter pot fi tratate n operaiile aritmetice ca un ntreg cu semn pe 8 bii. Cu alte
cuvinte, char i signed int pe 8 bii sunt interschimbabile. De asemenea, putem atribui un ntreg
n domeniul [-128, 127] unei variabile de tip char i [0, 255] unui unsigned char.
Caracterele non-tipribile i caracterele de control pot fi reprezentate printr-o secven
escape, care ncepe cu un back-slash (\) urmat de o liter (\n = new line , \t =tab , \b =
backspace etc), sau de codul numeric al caracterului n octal sau n hexazecimal (\012 = \0x0a =
10 este codul pentru caracterul de trecere la linie nou \n).
Cele mai utilizate secvene escape sunt:
Valori ir de caractere
Valorile ir de caractere sunt compuse din zero sau mai multe caractere precizate ntre
ghilimele.
Exemple:
"Hello, world!"
"The sum is "
""
Fiecare caracter din ir poate fi un simbol grafic, o secven escape sau un cod ASCII (n octal
sau hexazecimal). Spaiul ocupat este un numr de octei cu unu mai mare dect numrul
caracterelor din ir, ultimul octet fiind rezervat pentru terminatorul de ir: caracterul cu codul
ASCII 0, adica '\0'. Dac se dorete ca i caracterul ghilimele s faca parte din ir, el trebuie
precedat de \.
Exemple:
"CURS" - "\x43URS"
// scrieri echivalente ale unui ir ce ocup 5 octei
"1a24\t" - "\x31\x61\x32\x34\11"
//scrieri echivalente ale unui sir ce ocup 6 octei
"'\""
//ir ce conine caracterele '" i terminatorul - ocup 3 octei
Tipul void nu are constante (valori) i este utilizat atunci cnd funciile nu ntorc valori sau cnd
funciile nu au parametri:
void f ( int a)
{
if (a) a = a / 2;
}
void f (void);
// echivalent cu void f();
int f (void);
//echivalent cu int f();
Constante
Constantele pot fi: predefinite sau definite de utilizator.
Literele mari se folosesc n numele unor constante simbolice predefinite: EOF, M_PI, INT_MAX,
INT_MIN. Aceste constante simbolice sunt definite n fiiere header (de tip h) : EOF n
stdio.h, M_PI n math.h.
Exemple:
#define begin { // unde apare begin acesta va fi nlocuit cu {
#define end } // unde apare end acesta va fi nlocuit cu }
#define N 100 // unde apare N acesta va fi nlocuit cu 100
Tipul constantelor C rezult din forma lor de scriere, n concordan cu tipurile de date
fundamentale.
n C++ se prefer alt definire pentru constante simbolice, utiliznd cuvntul cheie const.
Pentru a face diferenierea dintre variabile i constante este de preferat ca definirea
constantelor s se fac pentru scrierea acestora cu majuscule.
Exemple:
Variabile
Variabila este o entitate folosit pentru memorarea unei valori de un anumit tip, tip asociat
variabilei. O variabil se caracterizeaz prin nume, tip, valoare i adres:
Orice variabil are un nume (identificator), exemplu: raza, area, varsta, nr. Numele
identific n mod unic fiecare variabil permind utilizarea acesteia, cu alte cuvinte,
numele unei variabile este unic (nu pot exista mai multe variabile cu acelai nume n
acelai domeniu de definiie)
Orice variabil are asociat un tip de date. Tipul poate fi orice tip fundamental sau
derivate, precum i tipuri definite de utilizator.
O variabil poate stoca o valoare de un anumit tip. De menionat c n majoritatea
limbajelor de programare, o variabil asociat cu un anumit tip poate stoca doar valori
aparinnd acelui tip. De exemplu, o variabil de tipul int poate stoca valoarea 123, dar
nu irul Hello.
Oricrei variabile i se aloc (rezerv) un spaiu de memorie corespunztor tipului
variabilei. Acest spaiu este identificat printr-o adres de memorie.
Pentru a folosi o variabil trebuie ca mai nti s i declarm numele i tipul, folosind una din
urmtoarele sintaxe:
tip nume_variabila;
// Declar o variabil de un anumit tip
Exemple:
n definirea tip lista_declaratori; tip poate fi precedat sau urmat de cuvntul cheie const, caz n
care variabilele astfel definite sunt de fapt constante ce trebuie s fie iniializate i care nu-i
mai pot modifica apoi valoarea:
Exemple:
int number;
nr = 99; //atribuie valoarea ntreag 99 variabilei nr
nr = 88; //i reatribuie valoarea 88
nr = nr + 1; //evalueaz nr+1 i atribuie rezultatul lui nr
int sum = 0;
int nr; //ERROR: O variabil cu numele nr e deja definit
sum = 55.66; // WARNING: Variabila sum este de tip int
sum = "Hello"; /* ERROR: Variabila sum este de tip int. Nu i se poate
atribui o valoare ir */
Observaii:
O variabil poate fi declarat o singur dat.
n fiiere cu extensia cpp putem declara o variabil oriunde n program, atta timp ct este
declarat nainte de utilizare.
Tipul unei variabile nu poate fi schimbat pe parcursul programului.
Numele unei variabile este un substantiv, sau o combinaie de mai multe cuvinte. Prin
convenie, primul cuvnt este scris cu liter mic, n timp ce celelalte cuvinte pot fi scrise cu
prima liter mare, fr spaii ntre cuvinte. Exemple: dimFont, nrCamera, xMax, yMin,
xStangaSus sau acestaEsteUnNumeFoarteLungDeVariabila.
Comentariile
Comentarii Multi-linie:
Comentarii n linie:
Exemple:
/* Acesta este
un comentariu n C */
Exemple
1 + 2 * 3 // rezult int 7
Operatorii
Tabelul operatorilor C indic att regula de asociativitate, implicit de la stnga la dreapta (s-a
figurat doar unde este dreapta-stnga), ct i clasele de preceden, de la cea mai mare la cea
mai mic preceden:
() paranteze (e)
[] indexare t[i]
. selecie s.c
-> selecie indirect p->c
-- postdecrementare a--
++ postincrementare a++
- schimbare semn -v
+ plus unar ( fr efect) +v
-- predecrementare --a
++ preincrementare ++a
! negaie logic !i dreapta - stnga
~ complementare ( negare bit cu bit ) ~i
* adresare indirect *p
& preluare adres &a
sizeof determinare dimensiune ( n octei ) sizeof(x)
() conversie de tip ( cast ) (d) e
* nmulire v1 * v2
/ mprire v1 / v2
% rest mprire ( modulo )
v1 % v2
+ adunare v1 + v2
- scdere v1 - v2
<< deplasare stnga i1 << i2
>> deplasare dreapta i1 >> i2
< mai mic v1 < v2
<= mai mic sau egal v1 <= v2
> mai mare
v1 > v2
>= mai mare sau egal
v1 >= v2
== egal v1 == v2
!= diferit v1 != v2
& i pe bii i1 & i2
^ sau exclusiv pe bii i1 ^ i2
| sau pe bii i1 | i2
&& i logic ( conjuncie ) i1 && i2
|| sau logic ( disjuncie ) i1 || i2
?: operator condiional ( ternar ) expr ? v1 : v2 dreapta - stnga
= atribuire a=v
*= /= %= a *= v
variante ale dreapta - stnga
+= -=
operatorului de atribuire
&= ^= |=
<<= >>=
, secveniere e1, e2
Legend:
a - variabila ntreag sau real i - ntreg
c - cmp v - valoare ntreag sau real
d - nume tip p - pointer
e - expresie s - structur sau uniune
f - nume de funcie t - tablou
x - nume tip sau expresie
Operatorii aritmetici
C suport urmtorii operatori aritmetici pentru numere de tip: short, int, long, long long, char
(tratat ca 8-bit signed integer), unsigned short, unsigned int, unsigned long, unsigned long long,
unsigned char, float, double i long double.
expr1 i expr2 sunt dou expresii de tipurile enumerate mai sus.
Este important de reinut c int / int produce un int, cu rezultat trunchiat, i anume partea
ntreag a mpririi: 1/2 0 (n loc de 0.5), iar operatorul modulo (% ) este aplicabil doar
pentru numere ntregi.
Trebuie scris astfel: (1+2*a)/3 + (4*(b+c)*(5-d-e))/f - 6*(7/g+h). Simbolul pentru nmulire '*' nu se
poate omite (cum este n matematic).
Depirile la calculele cu reali sunt semnalate, dar nu i cele de la calculele cu ntregi (valoarea
rezultat este trunchiat). Se semnaleaz, de asemenea, eroarea la mprirea cu 0.
Aceste operaii de comparaie returneaz valoarea 0 pentru fals i o valoare diferit de zero
pentru adevrat.
Convenie C:
Este incorect s scriem 1 < x < 100 , n loc de aceasta spargem n dou operaii de comparaie
x>1, x < 100, pe care le unim cu un operator logic I: (x > 1) && (x < 100).
Exemple:
/* Returneaz true dac year este bisect. Un an este bisect dac este
divizibil cu 4 dar nu cu 100, sau este divisibil cu 400.*/
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)
Operatorii de atribuire
Pe lng operatorul de atribuire '=' descris mai sus, limbajul C mai pune la dispoziie aa numiii
operatori de atribuire compui:
Limbajul C mai introduce i cei doi operatori aritmetici pentru incrementare '++' i
decrementare '--' cu 1:
Exemple:
int i, j, k;
// variabilele sunt initializate cu aceeasi valoare, 0
i = j = k = 0;
Operatorul sizeof
Rezultatul aplicrii acestui operator unar este un ntreg reprezentnd numrul de octei
necesari pentru stocarea unei valori de tipul operandului sau pentru stocarea rezultatului
expresiei dac operandul este o expresie. Operatorul are efect la compilare, pentru c atunci se
stabilete tipul operanzilor.
Sintaxa:
sizeof (tip)
sizeof (expresie)
Exemple:
sizeof('a') // 1
sizeof(int) // 2
sizeof(2.5 + 3) // 4??
De exemplu,
Operatorul condiional
Operatorul condiional ? : este singurul operator ternar. Are prioritatea mai ridicat doar dect
a operatorilor de atribuire i a celui secvential, iar asociativitatea este de la dreapta spre stanga.
El se folosete n situaiile n care exist dou variante de obinere a unui rezultat, dintre care se
alege una singur, funcie de ndeplinirea sau nendeplinirea unei condiii. Cei trei operanzi sunt
expresii, prima reprezentand condiia testat.
Exemple:
/* Expresia de mai jos determin valoarea maxim dintre a si b, pe care o
memoreaz n max:*/
max = a > b ? a : b;
Operatorul secvenial
Operatorul secvenial , ( virgul ) este cel cu prioritatea cea mai sczut. Se folosete atunci
cnd sintaxa limbajului impune prezena unei singure expresii, iar prelucrarea presupune
evaluarea a dou sau mai multe expresii; acestea se evalueaz de la stnga la dreapta, iar
rezultatul ntregii expresii este cel al ultimei expresii ( exprn ):
Exemplu:
/* Expresia de mai jos memoreaz n max valoarea maxim dintre a si b,
realiznd i ordonarea descresctoare a acestora (le interschimb dac
a<b). A se observa c interschimbarea presupune utilizarea unei variabile
auxiliare). Operatorul secvenial e necesar pentru a avea o singur
expresie dup : */
//