Nauči Sanmej Javu: savladajte operatore za 5 minuta
„Erge, da nagadjam naslepo, operatori su zapravo sabiranje, oduzimanje, množenje i deljenje, zar ne?“ Na Sanmej licu se vidio slatki osmeh, mislim da je bila veoma sigurna u pitanje koje je postavila.
„Da, Sanmej. Operatori zauzimaju važno mesto u Javi i uveliko pomažu u izvršavanju programa. Pored uobičajenog sabiranja, oduzimanja, množenja i deljenja, postoji i mnogo drugih tipova operatora. Pogledaj sledeću mapu uma.“

01. Aritmetički operatori
Pored najčešćeg sabiranja, oduzimanja, množenja i deljenja, aritmetički operatori uključuju i operator ostatka (moduo), koji se koristi za dobijanje ostatka pri deljenju. Hajde da osetimo to kroz kod.
int a = 10;
int b = 5;
System.out.println(a + b);//15
System.out.println(a - b);//5
System.out.println(a * b);//50
System.out.println(a / b);//2
System.out.println(a % b);//0
b = 3;
System.out.println(a + b);//13
System.out.println(a - b);//7
System.out.println(a * b);//30
System.out.println(a / b);//3
System.out.println(a % b);//1Za početnike su sabiranje (+), oduzimanje (-) i množenje (*) lako za razumevanje, ali deljenje (/) i operator ostatka (%) mogu izazvati blagu zabunu. U uobičajenoj percepciji, 10/3 se ne može precizno podeliti — rezultat bi trebao biti 3.333333..., a ne 3. Shodno tome, ni ostatak ne bi trebalo da bude 1. Zašto je to tako?
Zato što se brojevi u programu mogu podeliti u dve kategorije: celobrojni tip i tip sa pokretnim zarezom (onima koji nisu sigurni preporučujemo da pogledaju članak o tipovima podataka). Rezultat operacija između celobrojnih tipova je uvek celobrojni tip — nikada neće biti tip sa pokretnim zarezom. U protivnom, rezultat će biti tip sa pokretnim zarezom.
int a = 10;
float c = 3.0f;
double d = 3.0;
System.out.println(a / c); // 3.3333333
System.out.println(a / d); // 3.3333333333333335
System.out.println(a % c); // 1.0
System.out.println(a % d); // 1.0Treba imati na umu da kada se broj sa pokretnim zarezom podeli sa 0, rezultat je Infinity ili NaN.
System.out.println(10.0 / 0.0); // Infinity
System.out.println(0.0 / 0.0); // NaNInfinity znači beskonačno, a NaN znači „nije broj“ (Not a Number).
Kada se celobrojna vrednost podeli sa 0 (10 / 0), biće bačen izuzetak:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itwanger.eleven.ArithmeticOperator.main(ArithmeticOperator.java:32)Zato prilikom celobrojnog deljenja treba prvo proveriti da li je delilac jednak nuli, kako bi se izbeglo bacanje izuzetka.
Među aritmetičkim operatorima postoje i dva specijalna operatora: operator inkrementacije (++) i operator dekrementacije (--), koji se nazivaju i unarnim operatorima jer imaju samo jedan operand.
int x = 10;
System.out.println(x++);//10 (11)
System.out.println(++x);//12
System.out.println(x--);//12 (11)
System.out.println(--x);//10Unarni operator se može staviti ispred ili iza broja — kada je ispred, zove se predinkrement (preddekrement), a kada je iza, zove se postinkrement (postdekrement).
Postoji razlika između predinkrementa i postinkrementa. Uzmimo izraz int y = ++x (gde je x = 10) — on se može razložiti na x = x+1 = 11; y = x = 11, pa je rezultat izraza x = 11, y = 11. Uzmimo izraz int y = x++ (gde je x = 10) — on se može razložiti na y = x = 10; x = x+1 = 11, pa je rezultat izraza x = 11, y = 10.
int x = 10;
int y = ++x;
System.out.println(y + " " + x);// 11 11
x = 10;
y = x++;
System.out.println(y + " " + x);// 10 11Što se tiče preddekrementa i postdekrementa, možete sami probati.
02. Relacijski operatori
Relacijski operatori se koriste za upoređivanje dva operanda, a rezultat je true ili false.

Pogledajmo primer:
int a = 10, b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a < b); // true
System.out.println(a >= b); // false
System.out.println(a <= b); // true03. Bitski operatori
Pre nego što počnete da učite o bitskim operatorima, morate prvo naučiti o binarnom sistemu, jer bitski operatori ne deluje na celobrojne vrednosti (int, long, short, char, bajt) same po sebi, već na binarne reprezentacije tih celobrojnih vrednosti.
System.out.println(Integer.toBinaryString(60)); // 111100
System.out.println(Integer.toBinaryString(13)); // 1101Iz rezultata programa se može videti da je binarni zapis broja 60 — 0011 1100 (dopunjen nulama na 8 bitova), a binarni zapis broja 13 — 0000 1101.
PS: Moderni binarni brojevni sistem je 1679. godine dizajnirao Gotfrid Vilhelm Lajbnic. Lajbnic je bio nemački filozof i matematičar, retki polimat u istoriji.

Pogledajmo primer:
int a = 60, b = 13;
System.out.println("Binarni zapis a: " + Integer.toBinaryString(a)); // 111100
System.out.println("Binarni zapis b: " + Integer.toBinaryString(b)); // 1101
int c = a & b;
System.out.println("a & b: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = a | b;
System.out.println("a | b: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = a ^ b;
System.out.println("a ^ b: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = ~a;
System.out.println("~a: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = a << 2;
System.out.println("a << 2: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = a >> 2;
System.out.println("a >> 2: " + c + ", binarni zapis: " + Integer.toBinaryString(c));
c = a >>> 2;
System.out.println("a >>> 2: " + c + ", binarni zapis: " + Integer.toBinaryString(c));Za početnike je nemoguće intuitivno izračunati rezultat bitskih operatora, za razliku od sabiranja, oduzimanja, množenja i deljenja. To je zato što u svakodnevnom životu uglavnom koristimo decimalni sistem, pa je pri bitskim operacijama prvo potrebno pretvoriti brojeve u binarni zapis, a zatim izračunati rezultat.
S obzirom na to, početnici zapravo retko koriste bitske operacije pri pisanju koda. Iskusni programeri će, radi poboljšanja performansi programa, koristiti bitske operacije na određenim mestima. Na primer, HashMap koristi bitske operacije pri izračunavanju heš vrednosti:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}Ako uopšte ne razumete bitske operacije, naišavši na takav izvorni kod biće vam veoma teško. Dakle, iako se bitske operacije retko koriste, ipak ih je potrebno razumeti.
- Operator levog pomeranja (left shift):
System.out.println(10<<2);//10*2^2=10*4=40
System.out.println(10<<3);//10*2^3=10*8=80
System.out.println(20<<2);//20*2^2=20*4=80
System.out.println(15<<4);//15*2^4=15*16=24010<<2 jednako je 10 pomnoženo sa 2 na drugi stepen; 10<<3 jednako je 10 pomnoženo sa 2 na treći stepen.
- Operator desnog pomeranja (right shift):
System.out.println(10>>2);//10/2^2=10/4=2
System.out.println(20>>2);//20/2^2=20/4=5
System.out.println(20>>3);//20/2^3=20/8=210>>2 jednako je 10 podeljeno sa 2 na drugi stepen; 20>>2 jednako je 20 podeljeno sa 2 na drugi stepen.
04. Logički operatori
Logički operator I (&&): ako je samo jedan od više uslova netačan (false), rezultat je false.
Logički operator ILI (||): ako je samo jedan od više uslova tačan (true), rezultat je true.
int a=10;
int b=5;
int c=20;
System.out.println(a<b&&a<c);//false && true = false
System.out.println(a>b||a<c);//true || true = trueLogički operator NE (!): koristi se za inverziju rezultata uslova — ako je uslov true, logički operator NE će dati false.
Jednostruki logički operator I (&): retko se koristi, jer bez obzira na to da li je prvi uslov true ili false, ipak proverava drugi.
Jednostruki logički operator ILI (|): takođe proverava drugi uslov.
Dakle, performanse & i | su lošije od && i ||, ali je način upotrebe isti:
int a=10;
int b=5;
int c=20;
System.out.println(a<b&a<c);//false & true = false
System.out.println(a>b|a<c);//true | true = true05. Operatori dodele
Operator dodele je verovatno najčešće korišćeni operator u Javi — on dodeljuje vrednost sa desne strane operatora promenljivoj sa leve strane. Pogledajmo primer:
int a=10;
int b=20;
a+=4;//a=a+4 (a=10+4)
b-=4;//b=b-4 (b=20-4)
System.out.println(a);
System.out.println(b);Međutim, prilikom dodele numeričkih vrednosti potrebno je obratiti pažnju, na primer na sledeću situaciju:

Razlog zbog kog kompajler prijavljuje grešku je taj što se aritmetički izraz sa desne strane znaka = podrazumevano tretira kao tip int; kada je sa leve strane tip short, potrebno je izvršiti eksplicitno prevođenje (cast).
short a = 10;
short b = 10;
//a+=b;//a=a+b internally so fine
a = (short)(a + b);
System.out.println(a);Pored toga, postoje i problemi granica — na primer, kada se množe dva veoma velika broja tipa int, rezultat može preći opseg tipa int:
int a = Integer.MAX_VALUE;
int b = 10000;
int c = a * b;
System.out.println(c); // -10000Rezultat programa je -10000, što očigledno nije rezultat koji želimo. Iako se može rešiti eksplicitnim prevođenjem desne strane izraza u tip long:
int a = Integer.MAX_VALUE;
int b = 10000;
long c = (long)a * b;
System.out.println(c); // 21474836470000Ali pokušajte da ne radite to; kada je rezultat veoma velik, pokušajte da unapred koristite odgovarajući tip za dodelu.
long a = Integer.MAX_VALUE - 1;
long b = 10000;
long c = a * b;
System.out.println(c); // 2147483646000006. Ternarni operator
Ternarni operator se koristi kao zamena za if-else i omogućava da se zahtevi uslovnog ispitivanja ispune u jednom redu koda. Pogledajmo primer:
int a=2;
int b=5;
int min=(a<b)?a:b;
System.out.println(min);Ako je uslov ispred znaka ? true, rezultat je vrednost ispred znaka :, u protivnom je vrednost posle znaka :.
„Dobro, Sanmej, toliko o Java operatorima za sada. Da li ti je jasno?“ rekao sam Sanmej nakon što sam malo istegao ukočeni vrat.
„Manje-više, Erge, treba da napišem pokoji demo kao vežbu.“
07. Rezime
Ovaj članak sveobuhvatno predstavlja Java operatore, uključujući aritmetičke operatore, relacijske operatore, logičke operatore, bitske operatore, operatore dodele itd. Čitanjem ovog članka saznaćete o klasifikaciji, upotrebi i prioritetu Java operatora, kao i kako fleksibilno koristiti različite tipove operatora u praksi kako biste poboljšali efikasnost programiranja.
