Limbajul c si C++ abc-doar


datelor unare(ASCII) sunt: -~!(negatie si complement),*&(indirectie si



Yüklə 4,6 Mb.
səhifə6/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   2   3   4   5   6   7   8   9   ...   55

datelor unare(ASCII) sunt: -~!(negatie si complement),*&(indirectie si

adresa),sizeof(marimea),+ ++ --(incrementare si decrementare).

Operatorii care actioneaza atat asupra datelor unare cat si asupra celor

binare sunt:*%/(multiplicatori),+ -(aditivi),<< >>(comutatori),< > <=

>= == ! (relationali),& | ^ (manevrarea bitilor),&& || (logici) si virgula

(operator secvential).

Operatorii binari au precedenta fata de cei conditionali.Pot exista

diferente intre compilatoare,referitor la operatorii implementati.


-37-

Pentru limbajul C,precedenta operatorilor este urmatoarea:

OPERATOR: ORDINEA DE EVALUARE:

() [] . -> de la stanga la dreapta

! ~ - ++ -- & * sizeof de la dreapta la stanga

* / % de la stanga la dreapta

+ - -''- -''- -''-

<< >> -''- -''- -''-

< <= > >= -'' -''- -''-

== != -''- -''- -''-

& -''- -''- -''-

^ -''- -''- -''-

| -''- -''- -''-

&& -''- -''- -''-

|| -''- -''- -''-

?: de la dreapta la stanga

= += -= etc. de la dreapta la stnga

, de la stanga la dreapta

Limbajul C++,accepta un set extins de operatori,cu urmatoarea semnificatie

:: -este un operator al specificatorului "scope" care permite compilato-

rului sa utilizeze variabila globala in locul celei locale.

EXEMPLU: # include

int suma=123;

void main()

{

int suma=456;

cout <<:: suma; //va scrie variabila globala

cout << suma; //va scrie variabila locala

}

in exemplu,suma apare atat ca variabila globala(cu valoarea 123),cat si

ca variabila locala(cu valoarea 456).Operatorul :: precizeaza compila-

torului sa utilizeze varianta globala a variabilei.
[] -parantezele drepte ce apar in urma unui identificator desemneaza

pozitia unui element in cadrul unei arii.Atunci cand aria are mai

multe dimensiuni,se pot utiliza mai multe variabile incluse intre

paranteze de genul nume[variabila1][variabila2]...etc.Interpretarea

se va face de la stanga la dreapta.De obicei valoarea lor este un

numar intreg si desemneaza pozitia elementului in cadrul ariei.

EXEMPLU: int nAnLunaZi [10][12][366]

este o arie tridimensionala declarata pentru 10 ani a cate 12 luni si

366 de zile (se pot arhiva date distincte pentru fiecare zi)
() -parantezele rotunde ce apar in urma unui identificator desemneaza o

functie,respectiv un element al functiei respective.Valoarea returnata

va fi de acelasi tip cu valoarea declarata pentru functia respectiva.

O functie nu poate returna un obiect de tip arie.Daca functia a fost

declarata de tip void si valoarea returnata va fi tot void.

EXEMPLU: printf("Numarul de bilete este %d",nNrBilete)

in exemplu,functia printf returneaza atat constanta dintre ghilimele,

cat si valoarea variabilei nNrBilete.

Identic,pote returna si valoarea unei functii pointer.


-38-

(tipul datelor) -se utilizeaza pentru conversia explicita a tipului de

date.Conversia respecta aceleasi reguli ca si conversiile implicite

la care se adauga uneori restrictii determinate de dimensiunea sau

formatul datelor.Poate fi utilizat pentru conversia oricarui tip

de obiect scalar in oricare alt tip de obiect scalar.

EXEMPLU: float 3=3.1;

int i;

i=(int)x // i va avea valoarea 3

operatorul (int) a convertit valoarea lui x din float in int,adica

i va primi valoarea 3 in loc de 3.1
. -este operatorul de selectie a unui membru dintr-o structura,uniune sau

clasa

EXEMPLU: struct Date{

CString sGregorian;

int nJulian;

};

Date personale;

Date.nJulian=1;

Date.sGregorian="01/01/95";

in exemplu se declara structura Date si obiectul Date personale,iar

membri din Date sunt initializati cu valori incepand de la 01/01/1995.

Punctul s-a utilizat pentru selectia membrului din structura.
-> -este identic cu cel de mai sus,respectiv se utilizeaza pentru selectia

unui membru dintr-o structura,uniune sau clasa,in cazul in care membrul

respectiv este un pointer.

EXEMPLU: (*Date).nJulian este identic cu Date->nJulian

vezi exemplul de mai sus (daca membrii structurii sunt poineri)
++ -este operatorul de incrementare a datelor scalare(date cu o valoare

determinata si exprimata prin unitati de masura).Modul sau de actiune

este diferit in functie de pozitia sa fata de operand.In cazul in care

apare inaintea operandului,incrementarea se face inainte de a evalua

operandul.

EXEMPLU: int nNum1=1,nNum2=2,nTotal;

nTotal=(nNum1)+(++nNum2); //nTotal va fi 4

incrementarea lui nNum2 se face inainte de a efectua ecuatia,astfel

incat nNum2 devine 2+1,adica 3.

In cazul in care operatorul este utilizat dupa operand,atunci incre-

mentarea se va face doar dupa ce s-a evaluat expresia.

EXEMPLU: for (nCount=0;nCount<10;nCount++) {

nTotal += nArray[nCount];

}

in acest caz,bucla de operatii se va repeta de zece ori,iar dupa

fiecare operatie variabila nCount va creste cu 1 iar in aria nArray

se va adauga cate un element
-- -este operatorul de decrementare a datelor scalare.Actioneaza identic

cu cel de incrementare,cu diferenta ca scade in loc sa adune o unitate

Actiunea este influentata de pozitia in fata sau in urma operandului.


-39-

Pentru a desemna pozitia operatorului,se utilizeaza termenii de prefix

(prefix-expresie) si respectiv postfix(postfix-expresie).La fel ca si la

incrementare,daca operatorul este in fata identificatorului,atunci se

va opera initial decrementarea iar abea apoi se va evalua expresia,iar

daca operatorul se afla in urma identificatorului(postfix),atunci se va

evalua expresia iar incrementarea se va face ulterior.

EXEMPLE EXPLICITE:

int n=2;int x

x=n /* x primeste valoarea 2*/

x=++n + 1 /* n primeste valoarea 3 iar x va fi 4 */

x=n++ + 1 /* x primeste valoarea 3,apoi n va fi 3 */

x=n-- /* x primeste valoarea 2,apoi n va fi 1 */

x=n-- - 1 /* x primeste valoarea 1,apoi n va fi 1 */

x=--n /* n primeste valoarea 1,iar x va fi 1 */

x=--n - 1 /* n primeste valoarea 1,iar x va fi 0 */
* -este operatorul de indirectare prin care valoarea unei variabile este

accesata indirect,cu ajutorul unui pointer.Operandul trebuie sa fie

un pointer.Rezultatul operatiei este valoarea stocata in adresa de

memorie spre care este orientat pointerul.Tipul de data este cel

continut in tipul de pointer (cel al datelor originale).

Intuitiv,un pointer poate fi privit ca si un fel de vector intre

functia apelanta si variabila apelata(matematic nu este un vector!).

EXEMPLU: int x,y;

char c,ch;

int *px /* px este un pointer de tip int */

char *pc /* pc este un pointer de tip char */

in exemplu operatorul * este utilizat pentru declararea pointerilor

Pentru ca pointerul sa fie orientat spre o anumita variabila din tipul

declarat,se va utiliza ulterior operatorul de adresare &.

EXEMPLU (vezi mai sus): px=&x;

pc=&c;

pointerii px si pc,declarati anterior,"pointeaza"(se orienteaza spre)

variabilele x (de tip int) si respectiv c(de tip char)

Pointerii sunt un instrument extrem de util pentru operatiile asupra

memoriei(a datelor din memorie),pentru verificarea si depanarea apli-

catiilor,pentru detectarea fragmentelor defective de memorie,etc...
& -este operatorul de adresare,care preia adresa de memorie a operandului

Operandul poate fi o functie sau o variabila de tip structura,clasa,

uniune.Nu se aplica ariilor de biti si nici variabilelor declarate cu

register(care nu pot fi apelate global).

Se poate utiliza impreuna cu operatorul * pentru operatii cu pointeri.

EXEMPLU: int *pPtr; //se declara vectorul de tip int

int nArray[20]; //se declara aria de tip int

pPtr=&nArray[2] //vectorul este orientat spre adresa de

memorie a celui de al treilea element din aria nArray

In mod similar,se poate prelua fiecare element din aria nArray.

Pentru a intelege si mai bine utilitatea pointerilor,apreciati ca dupa

declararea tipului,un pointer va putea prelua date din mai multe arii,

cu conditia ca datele sa fie de acelasi tip cu pointerul(int,char,etc)


-40-

!(logic NOT) -este operatorul care inverseaza valoarea unei date de tip

logic.Astfel valoarea va fi 0 daca cea initiala a fost nenula,sau

va fi 1 daca valoarea initiala a fost zero(respectiv TRUE devine

FALSE si viceversa).Rezultatul va fi de tip int (zero sau 1)

Operandul trebuie sa fie de tip int,float sau pointer.

EXEMPLU: int x;

x=1;

IF y=!7;

x++;

y=x

bucla IF va incrementa pe x pana cand ajunge la valoarea 7
~ -este operatorul binar de complementaritate(inverseaza sensul fiecarui

bit-zero devine 1 iar 1 devine zero) care realizeaza o "imagine in

oglinda" a datelor binare.Uneori este numit si "not binar",deoarece

inverseaza semnificatia logica a fiecarui bit.Operandul trebuie sa

fie de tip int.Rezultatul final va fi de acelasi tip,dar cu date

convertite.

EXEMPLU: unsigned short y=OxAAAA; // valoarea lui y este OxAAAA

y=~y // valoarea lui y este Ox5555
sau in binar:

~ 0 1 0 1 1 1 0 1

_______________________

1 0 1 0 0 0 1 0 //bitii complementari
sizeof -este operatorul care returneaza dimensiunea in bytes(octeti) a

operandului.Este un cuvant cheie.Se poate utiliza pentru identifica-

tori sau pentru specificatorii de tip ai datelor.

Atunci cand se aplica,operatorul returneaza valoarea actuala a marimii

datelor(cea din momentul citirii),valoare care poate sa includa si un

spatiu aditional adaugat variabilei respective pentru ordonarea in

memorie(aliniere).Daca se aplica unei arii,returneaza dimensiunea

pentru intreaga arie(daca este statica).Nu se poate aplica pentru

ariile alocate dinamic sau pentru ariile declarate externe.

EXEMPLU: val=sizeof( int ) // marimea datelor de tip int

sau: int arie[]={1,2,3,4,5};

val2=sizeof(arie) //marimea ariei

Este foarte util mai ales in etapa de proiectare a unui program,pentru

a verifica spatiul de memorie ocupat de obiectele proiectate.
new -este cuvant cheie si operator specific pentru C++.Aloca memorie

pentru un obiect oarecare si returneaza un pointer de acelasi tip de

date spre obiectul respectiv(asigura calea de apelare a obiectului).

Daca operatia este nereusita,returneaza implicit zero.

Pentru a elimina memoria alocata cu new se poate utiliza operatorul

delete.

Sintaxa generala este:

[::] new [plasament] tipul de data [initiator]

sau:

[::] new [plasament] (tipul de data) [initiator]


-41-

[plasament]-este optiunea prin care se pot adauga argumente suplimentare,

atunci cand utilizati new pentru a suprascrie o functie(caz in

care compilatorul va selecta acea definitie a functiei care este

compatibila cu tipul datelor)

(tip de date)-specifica tipul datelor ce vor fi alocate.Daca tipul de date

este complicat (cu multe argumente),se poate include intre paran-

teze,pentru a forta ordinea de alocare a datelor

[initializator]-permite alocarea unei valori de start pentru obiectul

adaugat.Nu este aplicabil in cazul ariilor.New se poate utiliza

pentru a crea arii de obiecte,doar daca clasa in care este con-

tinut are un constructor implicit de arii.

Cea mai frecventa aplicatie este cea prin care se adauga un membru now

la o clasa sau o structura(pentru dezvoltarea programelor mai vechi).

EXEMPLE: int *pi=new int //aloca un intreg

char *pc=new char('a') //initializeaza caracterul a

Date *pmc=new Date(3,12,1985) //utilizeaza constructorul Date

int(**p)()=new(int(*[7])() ) //arie de 7 poineri spre functii

de tip int (intregi)
delete -este specific pentru C++.Dealoca(elimina) blocuri de memorie.

Sintaxa este:

[::] delete pointer sau [::] delete []pointer

Argumentul pointer trebuie sa directioneze operatorul spre un bloc de

memorie alocat anterior cu operatorul new.Daca blocul de memorie este

de tip arie,se adauga paranteze drepte in fata pointerului.

EXEMPLU: *pc=new char x('a');

delete x;

Trebuie mentionat faptul ca obiectul adaugat prin new nu fragmenteaza

memoria ci adauga blocul respectiv de memorie la coada stivei si apoi

creaza un pointer de accesare.Prin delete se sterge pointerul si

blocul de la coada stivei,iar memoria nu va ramane fragmentata.
, (virgula) -este operatorul de evaluare secventiala.

Nu trebuie confundat cu virgula utilizata pe post de separator.

Se utilizeaza pentru a evalua doua sau mai multe expresii intr-un con-

text in care nu este permisa decat o singura expresie(de exemplu inclusa

intr-o variabila).

Cei doi operatori ai expresiei vor fi evaluati secvential de la stanga

la dreapta.Operatoruldin stanga virgulei este evaluat ca si o expresie

de tip void(fara valoare).Rezultatul operatiei va fi de acelasi tip cu

cel al operandului din dreapta virgulei.Fiecare operator poate fi de

orice tip.Virgula nu modifica tipul nici unuia dintre cei doi operatori.

Expresia va fi evaluata pentru cel de al doilea operator,doar dupa ce

a fost completata evaluarea primului operator(inclusiv efectele secun-

dare).

EXEMPLU: Functie1(a,(b=1,b+2),c);

functia are trei argumente,dintre care al doilea a fost solutionat =3

sau: (r=t=1,t+2,t-1)

dupa evaluare variabila r va avea valoarea 1 iar t va avea valoarea 2

Atentie la formularea definitiilor unor functii,pentru a nu utiliza

virgula de separatie in loc de operator si viceversa(+paranteze rotunde)


-42-

* -este operatorul de multiplicare(inmultire).Se utilizeaza pentru

operatii aritmetice.In caz ca datele rezultate in urma operatiei nu

pot fi reprezentate de catre tipul de date specificat pentru operanzi

(sunt in afara domeniului de valori),datele se pierd(operatorul nu

verifica conditiile de overflow si underflow).

Verificati intotdeauna ca rezultatul scontat sa fie reprezentabil.

EXEMPLE: int Numar1=3,Numar2=4 ,short int Rezultat ;

Rezultat=Numar1*Numar2 //rezultatul va fi 12

variabila Rezultat nu va putea reprezenta numere mai mari decat 32767,

iar pentru operatii cu rezultat mai mare va trebui ales alt tip de

date.
/ -este operatorul de diviziune(impartire).Impartirea prin zero conduce

la o eroare.Daca ambii operanzi au acelasi semn,reziltatul se obtine

prin trunchiere la zero,iar daca au semn diferit tipul de trunchiere

a rezultatului este diferit in functie de tipul de procesor.

EXEMPLU: int Numar1=10,Numar2=3,Rezultat;

Rezultat=Numar1/Numar2

In cazul in care se utilizeaza in expresii complexe cu alti operatori

care au aceeasi precedenta (de exemplu *),evaluarea se va face de

la stanga la dreapta.

EXEMPLU: a/b*c se va executa ca si (a/b)*c deoarece la precedenta

egala se executa operatorul cel mai din stanga
% -este operatorul modul(impartire cu rest) si returneaza restul impar-

tirii dintre cei doi operanzi.

EXEMPLE: x=7,y=3,Rezultat;

Rezultat=x%y //Rezultat va fi 1 (7/3=2 rest 1)
sau int nCentury;

if((nCenturyYear%4)==0){

AnBisect();

}

verifica daca anul este bisect,daca DA atunci executa functia AnBisect()
+ -este operatorul pentru adunare simpla.Ambii operanzi pot fi de tip

int sau float,sau unul dintre operanzi poate fi un pointer iar cel de

al doilea de tip int.

EXEMPLU: int Numar1=1,Numar2=5,Rezultat;

Rezultat=Numar1+Numar2 //Rezultat va fi 6

Operanzii trebuie sa fie scalari(marimi reprezentabile).Este un ope-

rator de tip binar.Operanzii sunt convertiti daca este necesar.

Pointerii pot fi adunati doar cu intregi.
- -este operatorul pentru scadere simpla(substractie).Este tot de tip

binar.Operanzii pot fi de tip int sau float.Se admit operatii de scadere

dintr-un pointer doar pentru date de tip int iar rezultatul este valid

doar daca se refera la elemente din acelasi tablou.

EXEMPLU: int Numar1=8,Numar2=2,Rezultat

Rezultat=Numar1-Numar2 //Rezultat va fi 6

Operanzii trebuie sa fie scalari(reprezentabili).


-43-

>> si -sunt operatorii binari "de salt" si au asociativitate de la

<< stanga spre dreapta(la precedenta egala se executa cel din stg.)

Ambii trebuie sa fie de tip integral(int).Tipul de data al

rezultatului va fi cel al operandului din stanga(primul).

Pentru saltul spre dreapta (>>) la expresia e1>>e2,rezultatul va

fi e1/2^e2(adica e1/2 la puterea e2) iar pentru saltul spre

stanga (<<) in expresia e1<

e1*2 la puterea e2.

Rezultatul este nedefinit daca operandul din dreapta este negativ

(puteri negative),sau daca este mai mare decat numarul de biti

specificati prin operandul din stanga(nu poate fi reprezentat).

Operatia este de tip logic si are ca rezultat deplasarea spre

dreapta(>>) sau respectiv spre stanga(<<) a bitilor din operandul

stang cu atati biti cati sunt specificati prin operandul din

dreapta(sistemul binar opereaza cu puteri ale lui 2).Bitii vacan-

tati prin operatia de salt vor fi inlocuiti cu zero.

Este bine sa va asigurati ca tipul de data precizat prin operandul

din stanga aloca suficient spatiu de memorie pentru a putea repre-

zenta rezultatul final(fiecare salt se face exponential).

EXEMPLU: int NumarA=8; //este valoarea initiala

NumarA >> 2; //NumarA va fi 2 (8/2^2=8/4=2)

int NumarB=8;

NumarB << 2; //NumarB va fi 32(8*2^2=8*4=32)
< , > -sunt operatori relationali.Compara primul operand cu cel de al

<=, >= doilea si verifica daca relatia specificata prin operator este

==, != sau nu este adevarata.Daca relatia este adavarata,rezultatul

operatiei este 1,iar daca relatia nu este adavarata,rezultatul

operatiei este 0.Rezultatul este o data de tip int.

Pentru a putea fi comparati,operanzii trebuie sa fie de tip

aritmetic.Daca sunt pointeri,trebuie sa se refere la elementele

aceluiasi tablou(nu compara pointeri spre arii diferite de

memorie).

Semnificatia operatorilor este umratoarea:

< -mai mic EXEMPLU: int nr1=3,int nr2=7

nr1

> -mai mare EXEMPLU: nr1>nr2 //returneaza 0

<= -mai mic sau egal EXEMPLU: nr1<=nr1 //returneaza 1

>= -mai mare sau egal EXEMPLU: nr2>=nr2 //returneaza 1

== -strict egal EXEMPLU: nr1==nr2 //returneaza 0

!= -inegal EXEMPLU: nr1!=nr2 //returneaza 1

-se utilizeaza frecvent in instructiunile care determina bucle de

operatii iterative(repetitive) unde formeaza conditia de parasire a

buclei(operatiile se repeta pana cand un anumit parametru verifica

TRUE conditia precizata prin operatorul relational(returneaza 1).

EXEMPLU: int x=22;

do {

y=f(x);

x--;

} while (x>0);

executa y=f(x) apoi decrementeaza pe x pana cand x ajunge la zero


Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin