Transcript Document

C4 – LPO: Operatori
CUPRINS

Operatori







unari
de atribuire
aritmetici
relaţionali (de comparaţie)
pe biţi
logici
condiţional
Obiective
După parcurgerea acestui curs ar trebuie sa puteţi:
 transcrie expresii aritmetice in expresii Java formate
corect;
 scrie expresii logice ce asigura testarea unor condiţii
de funcţionare a aplicaţiei;
 manipula la nivel de bit tipurile întregi ale limbajului;
 optimiza scrierea de expresii Java pentru viteza mai
mare sau cod mai compact.
Conceptul de operator





Variabilele şi constantele se folosesc pentru stocarea datelor
in aplicaţie. Acestea devin operanzi in expresii.
Expresiile sunt secvente formate corect de operanzi si
operatori.
Operatorii sunt caractere speciale prin care Java este anunţat
despre operaţia ce trebuie să o facă cu operanzii asupra
cărora acţionează.
Operatorii au un efect şi produc un rezultat. Rezultatele sunt
valori noi ce se stocheaza sau se afiseaza.
Dupa numarul de operanzi operatorii ce clasifica in:



unari: 1 operand
binari: 2 operanzi
ternari: 3 operanzi.
Operatorii unari - 1





incrementrare: ++ are ca efect cresterea cu 1 unitate
operandului iar rezultatul se pune peste vechea valoare a
operandului (care se pierde)
decrementrare: -- are ca efect scaderea cu 1 unitate
operandului iar rezultatul se pune peste vechea valoare a
operandului (care se pierde)
+ si – unar: scot in evidenta natura pozitiva sau negativa
a operandului
inversare pe biti: ~ are ca efect inversarea valorilor binare
0 si 1 in 1 si 0 ale descompunerii binare ale operanului;
complement logic: ! are ca efect inversarea valorii logice a
operandului: true devine false, flase devine true
Operatorii unari ++ si -- ̶ 2

Operatorii de incrementare pot fi plasati inainte (prefix) sau
dupa (postfix) operand
++i; // prefixată: i se incrementează
// apoi de atribuie valoarea lui i
i++; // postfixată: se atribuie valoarea lui i, apoi se
// incrementează i
int i = 1;
System.out.println("i = " + i++);
System.out.println("i = " + i);
System.out.println("i = " + ++i);

i=1
i=2
i=3
În forma prefixată operatorul (incrementare sau decrementare)
este rezolvat înainte de orice alti operatori. În forma prefixată,
operatorul este rezolvat după toti operatorii expresiei in care
apare, astfel încât valoarea originală este cea folosită în
evaluarea expresiei şi nu cea actualizată.
Operatorul de atribuire = - 1





Formă: nume = expresie
expresie din stânga lui = se evaluează apoi valoarea ei se copiază
în nume, daca este cazul tipul valorii lui expresie se converteste la
cel a lui nume
= este operator, efectul lui este de copiere a valorii expresiei evaluate
în nume iar rezultaul este valoarea copiată, adică valoarea lui
expresie.Deseori, acest rezultat nu este folosit mai departe, deşi
utilizarea lui este corectă.
Modificarea valorii unui operand mai poarta denumirea de efect
secundar, în engleză “side effect”. În cazul operatorului = , denumirea
este forţată deoarece aici efectul de modificare este cel primar, exista
insa alti operatori unde acest efect exista dar este secundar
Atribuirea poate fi şi multiplă, situaţie în care asociativitatea
operatorului de atribuire este de la dreapta la stânga.
Operatorul de atribuire = - 2



Orice atribuire include o conversie de tip implicita
Intr-o expresie, efectele secundare ale unui
argument se evalueaza numai o singura data (nu de
mai multe ori)
Exemple:
int i, i1=0, i2 = 1;
i1=10;
i2=15;
i1=i2=7;
i=(i1=(i2=7));
Operatori aritmetici

-1
Realizează operţiile aritmetice de bază:


(cu tipuri primitive)
adunare; scadere; inmultire; impartire; modulo
Operanzii pot fi de tip primitiv numeric (literali sau
variabile) iar rezultatul este:




un tip primitiv numeric;
cel putin de tip int datorita promovarilor normale
de un tip cel putin la fel de larg cu cel mai larg dintre cei
2 operanzi
rezultatul se calculeaza prin promovarea operanzilor la
tipul rezultatului dupa care se realizeaza operatia
Operatori aritmetici

(cu tipuri primitive)
-2
Operatiile artimetice pot conduce felurite erori:






depasire (overflow): cand rezultatul e prea mare si nu poate fi
reprezentat in binar
pierdere (underflow): cand partea zecimala a unui numar se pierde
(2.75 devine 2) sau devine prea mica (nu se mai poate reprezenta in
binar)
impartirea cu zero genereaza exceptia ArtithmeticException;
orice alta aritmetica va da un rezultat, chiar daca acesta este incorect;
calculele in virgula flotanta implementeaza standardul IEEE 754 pentru
infinit, minus infinit si valori NaN;
calculele cu intregi care conduc la depasire, tipic, realizeaza truncherea
reprezentarii binare a rezultatului.
Operatori aritmetici – 3
Conversia si promovarea de tip





Orice variabila Java are un tip;
Datele pot sa-si modifice tipul explicit sau implicit;
Aceaste modificari pot sa apara ca urmare a unei cereri (adica
fortat) sau automat (initiate de sistem de la sine)
Conversie: Trecerea de la o reprezentare internă a unui tip de
date la o alta; conversia este automata fara modficarea
explicita a tipului; apare la: atribuirea; apeluri de metode;
promovare.
Promovare: conversie către un tip cu domeniu mai larg;
promovari automate:
char \
--> int --> long --> float --> double
byte --> short /

Forţare (tip_destinatie) valoare : conversie către un tip
cu domeniu mai îngust, se face obligatoriu explicit;
Operatori relationali

Întorc rezultate de tipul boolean (true, false)

Se folosesc la testarea unor condiţii între două expresii

Forma: expresie1 oprel expresie2, unde oprel pot fi:
>
mai mare
>=
<
<=
!=
mai mare sau egal
mai mic
mai mic sau egal
diferit
int i =
==
egal
1, j=4;
boolean rez;
rez = (i == j); // rez ia valoarea false
rez = (i < j); // rez ia valoarea true
Operatori logici - 1
Permit formarea de expresii logice pe baza rezultatelor operatorilor
relaţionali;
trebuie să aibă operanzi booleeni (adică de tipul boolean) şi generează
rezultate booleene;
Operatorii logici se definesc prin tabele de adevăr.



Fara scurtcircuitare
Cu scurtcircuitare
Nume
&&
&
SI
||
|
SAU inclusiv
^
SAU exclusiv
!
NU
int i=1, j=2, k=3;
boolean rez=true;
rez = (i<j) & (i==1);
rez = !rez;
// false
// true
Operatori logici - 2
op1
op2
&&
&
||
|
^
!
false
false
false
false
false
true
false
true
false
true
true
true
true
false
false
true
true
false
true
true
true
true
false
false
• Operatorii logici ce lucreaza cu scurtcircuitare imbunatatesc eficienta
evaluarii. Aceste reguli permit oprirea evaluarii la stanga operatorului;
• La & daca operandul stang este false, reultatul este false fara a mai evalua
operadul drept;
• La | daca operandul stang este true rezultatul este true fara a mai evalua
operandul drept.
Operatori pe biti - 1


Realizeaza operatii la nivel de biti SI, SAU INCLUSIV sau SAU
EXCLUSIV …
Operanzii trebuie sa fie numere intregi si sunt tratati ca vectori de biti
(si nu ca numere intregi) - (vezi curs pg.50)
Simbol
Operator
~
NU unar pe biţi
&
ŞI pe biţi
|
SAU EXCLUSIV pe biţi
^
SAU EXCLUSIV pe biţi
>>
deplasare la dreapta: a >> 2
>>>
deplasare la dreapta cu completare cu 0: a >>>3
<<
deplasare la stânga: a << 4
Operatori pe biti - 2

toti intregii sunt numere cu semn (exceptie char);
cel mai semnificativ bit determina semnul;
00101010 & > 42(10)
00001111 > 15(10)
00001010 > 10(10)
op1
op2
&
|
^
~
0
0
0
0
0
1
1
0
0
1
1
0
0
1
0
1
1
1
1
1
1
1
0
0
Operatorul conditional





Cunoscut si sub numele de operatorul ternar
consta intr-o secvenţa de 3 operanzi si
lucrează ca o instrucţiune if/else;
Forma: x=a?b:c
Se evaluează a, pt. true x=a, pentru false
x=b
a trebuie sa fie de tip boolean
Tipurile lui b si c trebuie sa fie compatibile, la
atribuire, cu x
Atribuirea compusa

Operatorul de atribuire poate fi combinat cu orice
operator aritmetic binar astfel încât în loc de:
(expresie1) = (expresie1) op (expresie2)
se poate scrie :
expresie1 op = expresie2

Codul obtinut in urma compilarii este mai compact si
rapid
double total = 0., suma =1., procent=0.5;
total = total + suma;
//1.
total+=suma;
//2.
total*=procent+1.5;
//4.
Expresia, prioritate si
asociativitate
Intr-o expresie ordinea rezolvarii operatorilor este data de prioritate si
asociativitate;

Prioritatea determină ordinea de rezolvare a operatorilor;

Dacă într-o expresie avem mai mulţi operatori consecutivi de aceeaşi
prioritate, atunci se aplică regula asociativitaţii (vezi curs pg. 56);

Utilizarea parantezelor rotunde redefineşte priorităţile, rezolvarea incepe
de la parantezele cele mai interioare.
23 - 6 * 4 / 3 + 12 – 31
este echivalenta cu
23 - ((6 * 4) / 3) + 12 – 31
La nivel principial, prelucrarea sau rezolvarea operatorilor se face în ordinea:
( ): operatorii din interiorul unor perechi de paranteze; evaluarea pleacă de la perechea cea mai
interioară;
++, –: operatorii de incrementare şi decrementare;
*, /: operatorii de multiplicare (înmulţire) şi diviziune (împărţire), evaluaţi de la stânga la dreapta;
+, -: operatorii de adunare şi scădere, evaluaţi de la stânga la dreapta.

Transcrierea unei expresii
aritmetice in Java
(-b + Math.sqrt(b * b – 4 * a * c))/(2 * a)
b2
4ac
b2 - 4ac
-b +
b2 - 4ac
-b +
b2 - 4ac
2a
2a
Rezumat





Operatorii sunt simboluri speciale ce definesc operaţii intre operanzi si
permit alcătuirea de expresii.
Orice operator are un efect si un rezultat. In unele situaţii rezultatul
poate fi ignorat.
Exista operatori ce modifica operanzii, se zice ca aceştia generează
efecte secundare (atribuirea simpla, compusa, incrementrarea,
decrementarea)
In expresiile aritmetice operanzii suporta conversii implicite in procesul
de evaluare. Acestea pot conduce la diferite categorii de erori
(depăşire, pierdere sau imposibilitatea reprezentării reale). Expresiile
aritmetice se evaluează pe baza regulilor de prioritate si asociativitate.
Java are implementaţi operatori pentru aritmetica, logica si manipulare
pe biţi a operanzilor si o grupa întreaga de operatori compuşi ce
permit scrierea mai scurta a expresiilor dar si generarea unui cod mai
eficient.
Intrebari
1.
2.
3.
4.
5.
Explicaţi diferenţele intre formele prefixate si postfixate in
cazul operatorilor de incrementare.
Explicaţi conversiile implicite ce sa realizarea in evaluarea
expresiei: 1+2.0/3.f
Utilizati operatorul condiţional pentru a calcula minimul si
maximul dintre doua numere reale.
Scrieţi codul pentru toate formele de incrementare a unei
variabile simple întregi si explicaţi fiecare varianta de
implementare.
Transcrieţi expresia din exemplul (sol. ec. grd. 2) prezentat
intr-o alta forma echivalenta ce utilizeaza mai putine
paranteze rotunde.
Bibliografie
1.
2.
3.
4.
5.
6.
http://www.oracle.com/technetwork/java/javase/documenta
tion/index.html
http://docs.oracle.com/javase/6/docs/
Ştefan Tanasă, Cristian Olaru, Ştefan Andrei, Java de la 0
la expert, Polirom, 2003, ISBN: 973-681-201-4.
Herber Schild, Java 2 - The Complete Reference, Fourth
Edition, Osborne, 2001, ISBN: 0-07-213084-9.
Deitel H.M., Deitel P. J., Java - How to programm, Fith
Edition, Prentice Hall, 2003, ISBN: 0-13-120236-7.
http://www.east.utcluj.ro/mb/mep/antal/downloads.html