|
datelor unare(ASCII) sunt: -~!(negatie si complement),*&(indirectie si
|
səhifə | 6/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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
Dostları ilə paylaş: |
|
|