22
C4 – LPO: Operatori CUPRINS Operatori unari de atribuire aritmetici relaţionali (de comparaţie) pe biţi logici condiţional

C4 – LPO: Operatori

  • Upload
    matteo

  • View
    88

  • Download
    0

Embed Size (px)

DESCRIPTION

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; - PowerPoint PPT Presentation

Citation preview

Page 1: C4 – LPO: Operatori

C4 – LPO: OperatoriCUPRINS Operatori

unari de atribuire aritmetici relaţionali (de comparaţie) pe biţi logici condiţional

Page 2: C4 – LPO: Operatori

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.

Page 3: C4 – LPO: Operatori

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.

Page 4: C4 – LPO: Operatori

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

Page 5: C4 – LPO: Operatori

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 = 1i = 2i = 3

Page 6: C4 – LPO: Operatori

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.

Page 7: C4 – LPO: Operatori

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));

Page 8: C4 – LPO: Operatori

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

Page 9: C4 – LPO: Operatori

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.

Page 10: C4 – LPO: Operatori

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 --> doublebyte --> short /

Forţare (tip_destinatie) valoare : conversie către un tip cu domeniu mai îngust, se face obligatoriu explicit;

Page 11: C4 – LPO: Operatori

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 falserez = (i < j); // rez ia valoarea true

Page 12: C4 – LPO: Operatori

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); // falserez = !rez; // true

Fara scurtcircuitare

Cu scurtcircuitare Nume

&& & SI

|| | SAU inclusiv

^ SAU exclusiv

! NU

Page 13: C4 – LPO: Operatori

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.

Page 14: C4 – LPO: Operatori

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

Page 15: C4 – LPO: Operatori

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

Page 16: C4 – LPO: Operatori

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

Page 17: C4 – LPO: Operatori

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.

Page 18: C4 – LPO: Operatori

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.

Page 19: C4 – LPO: Operatori

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

Page 20: C4 – LPO: Operatori

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.

Page 21: C4 – LPO: Operatori

Intrebari

1. Explicaţi diferenţele intre formele prefixate si postfixate in cazul operatorilor de incrementare.

2. Explicaţi conversiile implicite ce sa realizarea in evaluarea expresiei: 1+2.0/3.f

3. Utilizati operatorul condiţional pentru a calcula minimul si maximul dintre doua numere reale.

4. Scrieţi codul pentru toate formele de incrementare a unei variabile simple întregi si explicaţi fiecare varianta de implementare.

5. Transcrieţi expresia din exemplul (sol. ec. grd. 2) prezentat intr-o alta forma echivalenta ce utilizeaza mai putine paranteze rotunde.

Page 22: C4 – LPO: Operatori

Bibliografie

1. http://www.oracle.com/technetwork/java/javase/documentation/index.html

2. http://docs.oracle.com/javase/6/docs/

3. Ştefan Tanasă, Cristian Olaru, Ştefan Andrei, Java de la 0 la expert, Polirom, 2003, ISBN: 973-681-201-4.

4. Herber Schild, Java 2 - The Complete Reference, Fourth Edition, Osborne, 2001, ISBN: 0-07-213084-9.

5. Deitel H.M., Deitel P. J., Java - How to programm, Fith Edition, Prentice Hall, 2003, ISBN: 0-13-120236-7.

6. http://www.east.utcluj.ro/mb/mep/antal/downloads.html