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
Î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 (cu tipuri primitive) - 1
Realizează operţiile aritmetice de bază:
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
= = egal
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.
Operatori logici - 2
Operatori pe biti - 1
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)
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
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
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
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.