230 likes | 597 Views
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;
E N D
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 • Î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ă. ++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
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 int i = 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. int i=1, j=2, k=3; boolean rez=true; rez = (i<j) & (i==1); // false rez = !rez; // true
Operatori logici - 2 • 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)
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. truex=a, pentru falsex=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 : expresie1op = 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 2a b2 - 4ac -b + b2 - 4ac -b + b2 - 4ac 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 • 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 • http://www.oracle.com/technetwork/java/javase/documentation/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