Sunteți pe pagina 1din 17

Curs: Core Java Programming

Modul: Bazele programării Java


Unitate: Operatori

Pentru a crea un program cât de cât funcţional, în orice limbaj, pe


lângă variabile mai avem nevoie şi de operatori. Şi aici există o
clasificare generală: operatori de atribuire, operatori aritmetici,
operatori de comparaţie şi operatori logici. Mai există câteva tipuri de
operatori (operatori String, operatori Type, operatori
increment-decrement), dar acestea, în general, se bazează pe cei
patru operatori de bază (cum veţi vedea în continuare).

Operatori de atribuire

Operatorii de atribuire subînţeleg atribuirea valorii la o anumită


variabilă.

int a = 10;
String myString = "My string operator";
int z = 3;

Din lecţiile de până acum este clar că operatorul esenţial de atribuire


este semnul =

Totuşi, există şi anumite combinaţii de semne care, de asemenea, au


posibilitatea de atribuire, dar pentru ele se poate spune mai degrabă
că sunt prescurtări decât operatori (mai târziu vom vorbi şi despre
ele):

x+=5; //x=x+5;
y-=1; //x=x-1;
z++; //z=z+1;
++z;

Atribuirea subînţeleasă a valorii variabilelor este prin valoare.


Aceasta înseamnă că, în momentul în care atribuim variabilei o
valoare, această valoare se va afla chiar în variabila respectivă:

Când facem lucrul următor:

© Copyright Link group 1 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

int z=3;

Programul nostru a luat o parte din memoria calculatorului şi în


porţiunea aceasta a stocat numărul 3. De asemenea, a spus că
porţiunea aceasta a memoriei va răspunde în program la "numele" z.

Aceasta înseamnă că, dacă scriem:

int z=3;
int y=z;
z=5;

variabila y, după executarea tuturor celor trei linii, va avea valoarea 3.

Operatori aritmetici

Orice operaţie aritmetică cere şi operatori aritmetici (+,-,*,/,%).


Marcajele pentru adunare şi scădere sunt clare, iar ceilalţi trei
operatori sunt: * pentru înmulţire, / pentru împărţire şi % pentru rest
(modul).

Operatorul pentru rest reprezintă restul numărului întreg după


împărţirea a două numere.

10%3 dă ca rezultat valoarea 1


10%4 dă ca rezultat valoarea 2

La operaţii aritmetice, trebuie să luăm în considerare ordinea


executării lor. Operaţiile matematice din Java au aceeaşi prioritate de
executare ca în matematică. Înmulţirea şi împărţirea au avantaj faţă
de adunare şi scădere. Ordinea executării operaţiilor se poate schimba
prin folosirea parantezelor.

Pe lângă operatorii aritmetici de bază, Java asigură şi operatorii de


mărire şi micşorare a valorii (operatorii increment şi decrement).

© Copyright Link group 2 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Cum se poate vedea din tabel, câţiva dintre aceşti operatori sunt
unari. Respectiv, necesită doar o singură valoare pentru a funcţiona. În
unele cazuri, dacă dorim să facem incrementarea prin valoare explicită
(valoarea subînţeleasă fiind 1), atunci folosim şi a doua valoare în
operator.

La folosirea operatorilor increment-decrement, este foarte importantă


poziţia operatorului. Deşi următoarele două expresii sunt identice,
referitor la valoarea finală a variabilei:

a++; ?i ++a;

„Viaţa” acestei variabile, în cursul executării operatorului, nu este


aceeaşi. Putem stabili acest fapt foarte uşor, prin exemplul următor:

a=1;
int x=a++;

După ce se execută liniile de cod, variabila x va avea valoarea 1, dar


dacă schimbăm a doua linia cu:

int x=++a;

valoarea variabilei x va fi 2.

Deci, este clar ce s-a întâmplat. În primul exemplu, incrementarea este


făcută după atribuirea valorii, iar în al doilea exemplu, atribuirea
valorii s-a făcut după incrementare. Nici nu trebuie să spunem ce

© Copyright Link group 3 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

consecinţe poate avea gestionarea neatentă a operatorilor increment.

Pe lângă operatori, pentru lucrul cu numere se pot folosi şi metodele


integrate ale programului Java (mai precis, clasele Math), cum ar fi:
funcţia sqrt(), pentru calcularea rădăcinii pătrate a unui număr; funcţia
abs(), pentru calcularea valorii absolute a unui număr; funcţia ceil(),
care rotunjeşte numărul la primul număr întreg mai mare; funcţia
floor(), care rotunjeşte numărul la primul număr întreg mai mic;
funcţiile max() şi min(), care calculează maxim şi minim şi altele.

Iată câteva exemple de metode ale clasei Math:

//Calcularea r?d?cinii
int x=25;
System.out.println(Math.sqrt(x));

//Calcularea valorii absolute


int x=-5;
System.out.println(Math.abs(x));

//Rotunjirea la primul num?r întreg mai mare


double x=2.6;
System.out.println(Math.ceil(x));

//Rotunjirea la primul num?r întreg mai mic


double x=2.6;
System.out.println(Math.floor(x));

//Calcularea maximului ?i minimului a dou? numere


System.out.println(Math.max(2,5));
System.out.println(Math.min(2,5));

Operatori pentru concatenarea Stringurilor

Concatenarea (conectarea stringurilor) se face prin marcajul +

© Copyright Link group 4 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Linia următoare:

String link = "Link" + " Group";

Va atribui variabilei link valoarea "Link Group".

De asemenea, şi aici puteţi folosi un fel de operatori incrementali,


astfel încât (cu condiţia ca link să aibă deja valoarea atribuită din
exemplul precedent ("Link Group")) după următoarea linie valoarea
variabilei va fi "Link Group SRL":

link+=" SRL";

şi, fireşte, versiunea prelungită a aceleiaşi linii:

link = link + " SRL";

Soluţiile menţionate pentru concatenarea Stringului, deşi funcţionează


cu mici cantităţi de date, nu se consideră eficiente pentru manipularea
unor cantităţi mai mari de date, respectiv, cu concatenarea unui
număr mai mare de Stringuri. Am menţionat deja că obiectul String nu
se poate schimba într-adevăr, ci de fiecare dată când facem o
schimbare (concatenare), se creează un nou obiect. Aceasta afectează
memoria necesară pentru executarea programului. De aceea, în loc de
concatenare clasică, prezentată în exemplul de mai sus, în Java se
recomandă folosirea clasei StringBuilder pentru construirea mai
complexă a Stringurilor. Prin folosirea clasei StringBuilder, exemplul de
mai sus ar arăta aşa:

StringBuilder link = new StringBuilder();


link.append("Link");
link.append(" Group");
link.append(" SRL");
System.out.println(link);

Operatori de comparaţie

© Copyright Link group 5 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Operatorii aceştia fac comparaţia unor valori şi ca rezultat dau doar o


valoare de tip boolean. Marcajele lor sunt:

== este egal
!= nu este egal
< mai mic ca
> mai mare ca
>= mai mare sau egal
<= mai mic sau egal

Operatorii de comparaţie sunt foarte simpli pentru folosire şi cel mai


frecvent se folosesc în controlul de flux al programului.

Dacă introducem următorul exemplu în cod, după executarea se va


afişa rezultatul true.

boolean booleanMeu = 1==1;


System.out.println(booleanMeu);

Acesta este un comportament foarte logic. Întâi facem atribuirea


valorii (boolean booleanMeu =), iar apoi valoarea care se obţine prin
evaluarea expresiei 1==1. Această comparaţie de două numere (care,
evident, sunt identice), rezultă în valoarea true de tip boolean, astfel
încât şi variabila myBoolean este iniţializată la valoarea true.

Dacă am fi folosit acelaşi exemplu cu o altă valoare, am obţine o altă


valoare pentru variabila booleanMeu.

De exemplu:

...
boolean booleanMeu = 1!=1;
...

rezultat este false, pentru că am setat condiţia ca unu să nu fie unu.

Expresia următoare:

© Copyright Link group 6 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

...
boolean booleanMeu = 1>=1;
...

ar returna true, pentru că unu este mai mare sau egal cu unu.

Astfel de expresii nu se limitează la valori fixe sau la o comparaţie


unică. Se pot crea expresii nelimitat de complexe, limitate doar prin
capacitatea programatorului să interpreteze acest cod.

De exemplu:

...
boolean booleanMeu = (((10-5)*2)/10)==1;
...

Acest exemplu, deşi are o operaţie mai complexă în partea stângă a


operatorului de comparaţie, totuşi respectă convenţiile sintactice şi
produce un rezultat valabil.

Bineînţeles, verificările pe care le facem includ valori. Foarte rar, sau


niciodată, nu vom folosi astfel de verificări în practică. În schimb, ca
operatori de comparaţie se folosesc variabile:

int a = 10;
int b = 15;
boolean booleanMeu = a != b;
System.out.println(booleanMeu);

Trebuie să fim atenţi la diferenţa dintre operatorul de comparaţie ==


şi operatorul de atribuire =. Eroarea cauzată de folosirea greşită a
acestor doi operatori se poate întâmpla şi celor mai experimentaţi
programatori, şi poate să schimbe drastic cursul programului. De
aceea este foarte important să nu o facem. Din fericire, traducătorul
Java are mecanisme care se ocupă de acest fenomen, astfel încât nu
se întâmplă aşa de uşor.

© Copyright Link group 7 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Operatori logici (condiţionali)

Operatorii aceştia unesc mai multe expresii într-o anumită condiţie şi,
de asemenea, dau o valoare de tip boolean:

• prima expresie && a doua expresie – dacă şi prima şi a doua


expresie sunt corecte, rezultatul este true (corect),
• prima expresie || a doua expresie – dacă prima sau a doua expresie
sunt corecte, rezultatul este true.

Operatorii aceştia, practic, fac un set adiţional de opţiuni pentru


operatorii de comparaţie, deoarece adaugă la crearea expresiei încă o
"dimensiune". Dacă, de exemplu, am dori să verificăm dacă a este
egal cu unu, dar şi dacă a este egal cu doi, nu o putem face doar
folosind operatorii de comparaţie. Pe de altă parte, dacă introducem
operatori logici, aceasta se face destul de uşor:

int a = 1;
boolean myBoolean = a == 1 || a == 2;
System.out.println(myBoolean);

În mod identic, putem rezolva problema în care dorim să verificăm


dacă a este mai mic ca 10, dar mai mare ca 5:

int a = 1;
boolean myBoolean = a > 5 && a < 10;
System.out.println(myBoolean);

Trebuie să luăm în considerare faptul că, o dată ce o condiţie este


îndeplinită în astfel de comparaţii, restul condiţiilor nu se mai verifică,
ci momentan verificarea condiţiilor este părăsită şi executarea
programului se continuă.

Operatorii Bit (operaţii asupra biţilor)

Fiindcă cea mai mică unitate care se poate gestiona în Java este byte

© Copyright Link group 8 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

(octet), Java permite nişte operatori care pot gestiona şi la nivel mai
scăzut, respectiv cu valori la nivel de biţi.

Aceştia sunt operatorii bit shift şi operatorii bit OR, AND şi XOR.

Operatorii shift (<< şi >>) permit deplasarea biţilor în stânga sau în


dreapta, în cadrul unui byte.

De exemplu:

int a=10;
int b=a<<1;
System.out.println(a);
System.out.println(b);
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));

Valoarea variabilei a este 10. În scrierea binară, numărul: 1010.

Când atribuim variabilei b valoarea a<<1, noi de fapt deplasăm toţi


biţi în variabila a cu un loc în stânga şi atribuim noua valoare variabilei
b. Această valoare este acum 10100 (sau, dacă vă este mai uşor
00010100, respectiv 0000000000010100).

Valoarea variabilei b acum va fi 10100, respectiv 20.

Dacă doriţi să vedeţi reprezentarea binară a numărului, puteţi folosi


conversia Integer.toBinaryString cum am făcut în exemplul de mai sus.

Aceleaşi reguli sunt valabile şi pentru operatorul >>, numai că în acest


caz, biţii se deplasează cu un loc spre dreapta.

Nu binar (complement) (~) este operatorul care inversează


conţinutul de byţi ai variabilei actuale.

Dacă valoarea variabilei binară a fost 1010, acum va fi 0101.


Respectiv, 11111111111111111111111111110101, ceea ce puteţi
încerca prin exemplul următor:

© Copyright Link group 9 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

int a=10;
int b=~a;
System.out.println(b);
System.out.println(Integer.toBinaryString(b));

Şi binar (&) dă o nouă valoare ca rezultat. Această valoare este


alcătuită din biţi comuni cu valoarea unu a valorilor comparate.

De exemplu:

0101 &
1011 face
0001

Sau binar (|) dă, de asemenea, o nouă valoare ca rezultat. Însă, în


acest caz, valoarea este alcătuită din toţi biţii, unde cel puţin una din
valorile comparate are valoarea unu.

De exemplu:

0101 |
1011 face
1111

XOR binar (exclusive or) (^) operatorul ia în considerare doar biţii în


care şi una, şi cealaltă variabilă au valoarea 1, dar nu şi dacă ambele
au această valoare.

1010 ^
1000 face
0010

int a = 10;
int b = 20;
int c = b ^ a;
System.out.println(c);
System.out.println(Integer.toBinaryString(c));

© Copyright Link group 10 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Exerciţiu 1

Problemă:

Este necesar să creăm un program care adună două numere


reprezentate prin două variabile. Primul număr este variabila x, cu
valoarea 1, iar celălalt este variabila y, cu valoarea 2. Trebuie să
atribuim variabilei z rezultatul adunării acestor două variabile.

Rezolvare:

public class Test {


public static void main(String[] args)
{
//exemplu 1
//adunarea a doua numere
//atribuirea valorii variabilei x
int x=1;
//atribuirea valorii variabilei y
int y=2;
//atribuirea valorii variabilei z prin adunarea x ?i y
int z=x+y;
//emiterea rezultatului
System.out.println(z);
}
}

Rezultatul trebuie să fie cifra 3.


Comentariile explică clar ce se întâmplă în acest exemplu.

Exerciţiu 2

Problemă:

© Copyright Link group 11 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Trebuie să creăm un program care calculează suprafaţa cercului.

Rezolvare:

public class Test {


//definirea constantei PI
static final double PI = 3.14;
public static void main(String[] args)
{
//definirea variabilei r
double r = 5;
//definirea variabilei p ca rezultat al calcularii
suprafetii cercului
double p = (r*r)*PI;
//emiterea variabilei p care contine rezultatul -
suprafata cercului cu raza r
System.out.println(p);
}
}

Acest program, deşi scurt, conţine nişte fenomene foarte interesante.

În primul rând, definirea constantei. Deja am descris procedura


aceasta în lecţia precedentă:

static final double PI = 3.14;

În loc de PI, putem folosi orice alt nume (în cadrul convenţiilor de
denumire a variabilelor).
Oricum, în definirea constantei, nu suntem limitaţi doar la valori
numerice. Constanta poate purta orice tip de date.

static final string name = ”Numele meu”; //tip string


static final int a = 10; //tip numar intreg
static final boolean chk = true; //tip boolean

La sfârşit, în ultima linie, programul pur şi simplu emite rezultatul la


ieşire.

© Copyright Link group 12 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

Trebuie să menţionăm şi că nu era necesar să calculăm pătratul lui r în


mod manual, ci puteam folosi cu acest scop una dintre funcţiile pentru
lucrul cu operaţiile matematice:

Math.pow(10, 2)

unde primul număr este valoarea de intrare, iar al doilea este


exponent (puterea).

Exerciţiu 3

Problemă:

Programul conţine trei Stringuri cu date despre utilizator:

public class Test {


public static void main(String[] args)
{
String firstName = "Marin";
String lastName = "Marinescu";
String birthDate = "01/01/1980";
}
}

Trebuie să creăm un program, astfel încât să emită datele despre


Stringurile date cu ieşirea formatată în felul următor:

First name: Marin, Last name: Marinescu, Birth date: 01/01/1980

Întregul String formatat trebuie să fie conţinut într-o singură variabilă.

Soluţie:

public class Test {


public static void main(String[] args)
{

© Copyright Link group 13 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

String firstName = "Marin";


String lastName = "Marinescu";
String birthDate = "01/01/1980";
String datele = "First name: " + firstName + ", Last name:
" + lastName + ", Birth date: " + birthDate;
System.out.println(data);
}
}

© Copyright Link group 14 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

CJPro_06 - Core Java Programming


1. Care va fi valoarea variabilei x după executarea următoarei
linii?<br/&gt<i&gt   boolean x = 1 = 1;</i&gt
a) Nu va fi niciuna. Linia este defectă.
b) true
c) false
d) 1
2. Care va fi valoarea variabilei x după executarea următoarei
linii?
   boolean x = 1 == 1;
a) true
b) Nu va avea nicio valoare. Linia este defectă.
c) false
d) 1
3. De care tip este operatorul "+"?
a) aritmetic
b) de comparare
c) de atribuire
d) logic
4. Dacă x este 1, înainte de următoarea linie
   x++;
cât va fi x după aceea?
a) 2
b) 1
c) 0
d) 3
5. Cât este 10%2 ?
a) 0
b) 1

© Copyright Link group 15 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

c) 2
d) 3
6. Cât este 2
a) 4
b) 3
c) 2
d) 1
7. Care este ieşirea codului următor?
   System.out.println("10" + "20");
a) 1020
b) 30
c) 12
d) 120

© Copyright Link group 16 / 17


Curs: Core Java Programming
Modul: Bazele programării Java
Unitate: Operatori

1. Care va fi valoarea variabilei x după executarea următoarei


linii?<br/&gt<i&gt   boolean x = 1 = 1;</i&gt
a
2. Care va fi valoarea variabilei x după executarea următoarei
linii?
   boolean x = 1 == 1;
a
3. De care tip este operatorul "+"?
a
4. Dacă x este 1, înainte de următoarea linie
   x++;
cât va fi x după aceea?
a
5. Cât este 10%2 ?
a
6. Cât este 2
a
7. Care este ieşirea codului următor?
   System.out.println("10" + "20");
a

© Copyright Link group 17 / 17

S-ar putea să vă placă și