Bir ileme yola aan ve ilem sonucunda bir deer retilmesini salayan atomlara operatr denir.
Operatrler 3() biimde snflandrlabilabilirler:
2. Operand saylarna gre snflandrma: Operatrle ileme sokulan ifadelere operand denir. Operand
saylarna gre operatrleri aadaki gibi gruplandrabiliriz:
Farkl ilevleri olan operatrlere ilikin atomlar ayn olabilmektedir. rnein + karakteri hem toplama
operatr hem de iaret operatr olarak kullanlmaktadr.
Operatrler Arasndaki ncelik likisi
Her operatrn dierine gre bir ncelik durumu (precedence) vardr. rnein * operatr + operatrnden
daha yksek nceliklidir. Operatrlerin bazlar eit ncelikte olabilirler. lemler genel olarak ncelik
srasna gre yaplr. rnein:
ileminin yapl
i1: c * d
i2: b + i1
i3: a = i2
eklindedir.
ilemi
i1: b + c
i2: i1 * d
i3: a = i2
eklinde yaplr.
Operatrler arasndaki ncelik ilikisi operatr ncelik tablosu denilen bir tabloyla betimlenir. rnein:
Operatr likisi
() Soldan saa
*/ Soldan saa
+- Soldan saa
= Sadan sola
ncelik tablosunda yukardaki satrlar aadaki satrlara gre yksek nceliklidir. Ayn satrdakiler eit
nceliklidir. Eit ncelikli operatrler ifade ierisindeki konumlarna gre soldan saa (left associative) ya
da sadan sola (right associative) ncelikli olarak yaplrlar. rnein:
a = b * c / d;
Burada * ve / operatrleri eit ncelikli olduundan ve bu operatrler soldan saa ncelikli olduundan
ilemler
i1: b * c
i2: i1 / d
i3: a = i2
eklinde yaplr.
*, /, + ve operatrleri
Bu operatrler iki operandl araek durumunda aritmetik operatrlerdir. Matematikteki klasik 4(drt) ilemi
yaparlar. rnein:
package csd;
class App {
public static void main(String [] args)
{
int a, b, c;
a = 10;
b = 5;
c = a + b;
System.out.println(c);
c = a * b;
System.out.println(c);
c = a / b;
System.out.println(c);
}
}
% operatr
Bu operatre mod operatr de denmektedir. Operatr sol taraftaki operandn sa taraftaki operanda
blmnden elde edilen kalan deerini retir.
package csd;
class App {
public static void main(String [] args)
{
int a, b, c;
a = 10;
b = 5;
c = a % b;
System.out.println(c);
}
}
% operatrnn rettii deer iin blme ilemi yapldndan operatr ncelik tablosunda * ve / operatr
ile soldan saa ncelikli grupta bulunmaktadr.
Operatr likisi
() Soldan saa
+- Soldan saa
= Sadan sola
aret + ve aret operatrleri
aret + ve iaret operatrleri tek operandl nek durumunda aritmetik operatrlerdir. aret operatr
operandnn negatif deerini retir.
package csd;
class App {
public static void main(String [] args)
{
int a, b;
a = 10;
b = -a;
System.out.println(a);
System.out.println(b);
}
}
aret + operatr operand ile ayn deeri retir. Yani aslnda hibir ilem yapmaz.
package csd;
class App {
public static void main(String [] args)
{
int a, b;
a = 10;
b = +a;
System.out.println(a);
System.out.println(b);
}
}
aret + ve iaret operatrleri ncelik tablosunun ikinci dzeyinde sadan sola grupta bulunurlar.
Operatr likisi
() Soldan saa
+- Sadan sola
+- Soldan saa
= Sadan sola
++ ve -- Operatrleri
++ operatrne artrma (increment) -- operatrne eksiltme (decrement) operatr denir. Bu operatrler tek
operandl nek ve sonek olarak kullanlabilen aritmetik operatrlerdir. ++ operatr operandn deerini
1(bir) artrr, -- operatr operandn deerini 1(bir) eksiltir. Bu operatrler ncelik tablosunun ikinci
dzeyinde sadan sola grupta bulunurlar.
Operatr likisi
() Soldan saa
+ - ++ -- Sadan sola
+- Soldan saa
= Sadan sola
Bu operatrlerin nek ve sonek kullanmlar farkldr. Bu operatrlerin hem nek hem de sonek kullanmlar
tabloda belirtilen ncelikle yaplr. Ancak nek kullanmda sonraki ileme deikenin artrlm ya da
eksiltilmi deeri sokulurken, sonek kullanmda deikenin artrlmam ya da eksiltilmemi deeri sokulur.
Yani ++ ve -- operatrlerinin nek kullanmlarnda rettikleri deerler srasyla artrlm ve eksiltilmi
deerlerdir, sonek kullanmlarnda rettikleri deerler de srasyla artrlmam ve eksiltilmemi deerlerdir.
rnein:
package csd;
class App {
public static void main(String [] args)
{
int a, b;
a = 10;
b = ++a;
System.out.println(a); // 11
System.out.println(b); // 11
}
}
rnein:
package csd;
class App {
public static void main(String [] args)
{
int a, b;
a = 10;
b = a++;
System.out.println(a); // 11
System.out.println(b); // 10
}
}
b = 8++; //error
ifadesinde ++ operatrnn operand sabit olduundan ifade geersizdir.
Anahtar Notlar: C/C++ dillerinde ++ ve -- operatrleri ile bu operatrlerin operandlarnn ayn ifadede
bulunmas tanmsz davrana (undefined behaviour) yol amaktadr. Java' da herhangi bir sorun
bulunmamaktadr. Derleyicinin tanmsz davran C/C++ standartlarna gre ksaca ne olaca belli olmayan
durumlar iin kullanlmaktadr. Yani bu dillerde programc tanmsz davrana yol aacak kodlardan
kanmaldr anlamna gelmektedir. Java' da tanmsz davrana yol aacak hi bir durum yoktur. Yani Java'
da bir ifade ya geerli ya da geersiz (error) olmaktadr.
Bilindii gibi Java' da atomlar arasnda istenildii kadar boluk braklabilir. Atomlar istenildii kadar
bitiik yazlabilir. Anahtar szckler ve deikenler bitiik yazlamaz kurallar geerlidir. Peki aadaki
gibi bir ifadeyi derleyici nasl alglayacaktr?
a = b+++c;
Yani derleyici bu ifade iin, a = b + ++c; biiminde mi yoksa a = b++ + c; biiminde mi ilem
yapacaktr? Burada derleyici derleme srasnda anlaml en uzun ifadeyi seer. Yani a = b++ + c biiminde
ilem yaplacaktr. rnek bir test kodu aadaki gibi yazlabilir:
package csd;
class App {
public static void main(String [] args)
{
int a, b, c;
a = 10;
b = 8;
c = a+++b; // c = a++ + b;
System.out.println(a); //11
System.out.println(b); //8
System.out.println(c); //18
}
}
Karlatrma Operatrleri
Toplam 6(alt) adet karlatrma operatr vardr. Bu operatrler iki operandl araek durumunda
operatrlerdir. Karlatrma operatrleri boolean trden deer retirler. Bu operatrler ncelik tablosunda
artimetik operatrlerden daha dk ncelikli gruptadr.
Operatr likisi
() Soldan saa
+ - ++ -- Sadan sola
+- Soldan saa
== != Soldan saa
= Sadan sola
rnein:
package csd;
class App {
public static void main(String[] args)
{
int a, b;
a = 10;
b = 8;
boolean result;
result = a >= b;
System.out.println(result); //true
}
}
Bu operatrlerden == operatr eitlik karlatrmas yapar. Operandlar birbirine eitse true deilse false
deerini retir. rnein:
package csd;
class App {
public static void main(String[] args)
{
int a, b;
a = 8;
b = 8;
boolean result;
result = a == b;
System.out.println(result); //true
}
}
Benzer ekilde != operatr operandlarnn eitsizlii durumunda true eitlii durumunda false deerini
retir. rnein:
package csd;
class App {
public static void main(String[] args)
{
int a, b;
a = 8;
b = 8;
boolean result;
result = a != b;
System.out.println(result); //false
}
}
Benzer ekilde < operatrnn mantksal tersi >= operatr ve > operatrnn mantksal tersi de <=
operatrdr.
Mantksal Operatrler
operatrleridir.
&& ve || operatrleri iki operandl araek durumunda, ! operatr tek operandl nek durumunda
operatrlerdir. Mantiksal operatrlerin operandlar boolean trden olmak zorundadr. rettikleri deerler de
boolean trdendir. rettikleri deerler yledir:
&& ve || operatrleri
A B A && B A || B
! operatr
A !A
True False
False True
&& ve || operatrleri ncelik tablosunda karlatrma operatrlerinden daha dk ncelikli soldan saa
grupta bulunmaktadrlar. ! operatr ncelik tablosunun ikinci dzeyinde sadan sola grupta bulunmaktadr.
Operatr likisi
() Soldan saa
+ - ++ -- ! Sadan sola
*/% Soldan saa
+- Soldan saa
== != Soldan saa
|| Soldan saa
= Sadan sola
rnein:
package csd;
class App {
public static void main(String[] args)
{
boolean result;
System.out.println(result);
}
}
class Sample
{
public static boolean foo()
{
System.out.println("foo");
return true;
}
return false;
}
}
rnein:
package csd;
class App {
public static void main(String[] args)
{
boolean result;
&& ve || operatrlerinin ksa devre (short circuit) zellikleri vardr. Bu operatrler klasik ncelik kurallarna
uymazlar. Bu operatrlerin sa tarafnda ne olursa olsun nce sol tarafndaki ifade yaplr ve bitirilir.
Duruma gre sa tarafndaki ifade yaplr. Mantksal AND ve mantksal OR ilemleri ksaca yle
tanmlanabilir:
Mantksal AND: fadelerden her ikisi birden true ise sonu true, dier btn durumlarda false.
Mantksal OR: fadelerden her ikisi birden false ise ilem false, dier btn durumlarda true.
Bu tanmlara gre, && operatr iin sol tarafndaki ifade false ise sa taraf ne olsun sonucu
etkilemeyecektir. Benzer ekilde || operatr iin de sol tarafndaki ifade true ise sa taraf ne olursa olsun
sonu deimez. Bu sebeple && operatrnn sol taraf false ise sa taraf hi yaplmaz, || operatrnn sol
taraf true ise sa taraf hi yaplmaz.
rnein:
package csd;
class App {
public static void main(String[] args)
{
boolean result;
System.out.println(result);
}
}
class Sample
{
public static boolean foo()
{
System.out.println("foo");
return true;
}
return false;
}
}
Grld gibi bar metodunun geri dn deeri false olduundan ksa devre zelliinden dolay foo
metodu arlmamaktadr.
rnein:
package csd;
class App {
public static void main(String[] args)
{
boolean result;
System.out.println(result);
}
}
class Sample
{
public static boolean foo()
{
System.out.println("foo");
return true;
}
return false;
}
}
Aslnda ksa devre zellii farkl bir sonucun kmasna yol amaz. ncelik tablosu tam olarak uygulanrsa
kacak sonu ayndr. Ksa devre zellii ile bu sonu daha hzl elde edilir.
Java' da & ve | operatrleri bit dzeyinde AND ve OR ilemlerini yapar. Bu operatrler iki operandl araek
durumunda soldan saa ncelik grubunda operatrlerdir.
Operatr likisi
() Soldan saa
+ - ++ -- ! Sadan sola
+- Soldan saa
== != Soldan saa
| Soldan saa
|| Soldan saa
= Sadan sola
Bu operatrler saynn karlkl bitlerini AND ve OR ilemlerine sokarlar. Bu operatrlerin Java' da asl
kullanmlar bit ilemleri olmasna karn boolean trden operandlarla da ileme sokulabilir. & ve |
operatrlerinin ksa devre zellii yoktur. Bu sebeple boolean trden operandlar ile ksa devre zellii
olmayan mantksal AND ve OR operatrleri gibi de kullanlabilirler.
.
! operatr tek operandl nek durumunda bir operatrdr. ! operatrnn operand boolean trden olmak
zorundadr. Bu operatr operandnn mantksal olarak tersini retir. Yani operandnn deeri true ise false,
false ise true deerini retir. rnein:
package csd;
class App {
public static void main(String[] args)
{
boolean a, b;
a = true;
b = !a;
System.out.println(a); // true
System.out.println(b); // false
}
}
Atama Operatr
Atama operatr iki operandl araek durumunda sadan sola ncelik gurubunda bulunan operatrdr. Bu
operatr en dk ncelikli operatrdr.
Operatr likisi
() Soldan saa
+ - ++ -- ! Sadan sola
+- Soldan saa
== != Soldan saa
| Soldan saa
|| Soldan saa
= Sadan sola
rnein:
package csd;
class App {
public static void main(String[] args)
{
int a, b;
b = 10;
a = b;
System.out.println(a); //10
System.out.println(b); //10
}
}
Java' da bir grup *=, /=, +=, -= biiminde ilemli atama operatrleri vardr. Bu operatrler iki operandl
araek durumunda sadan sola ncelik grubunda operatrlerdir. Bu operatrler atama operatr ile ayn
ncelik grubunda bulunurlar.
Operatr likisi
() Soldan saa
+ - ++ -- ! Sadan sola
+- Soldan saa
== != Soldan saa
| Soldan saa
|| Soldan saa
= *= /= += -= Sadan sola
package csd;
class App {
public static void main(String[] args)
{
int a, b;
a = 10;
b = 8;
a += b; // a = a + b
System.out.println(a); //18
System.out.println(b); //8
}
}
Java programlama dilinin tm operatrlerine ilikin ncelik tablosu aadaki gibidir.
Operatr likisi
+ - ++ -- ! ~ ( ) Sadan sola
+- Soldan saa
== != Soldan saa
^ Soldan saa
| Soldan saa
|| Soldan saa
?: Sadan sola
Bu blmde anlatlmayan operatrler iin bir takm konularn da bilinmesi gerektiinden bu operatrler
daha sonra ele alnacaktr.
Etkisiz fadeler
Java' da bir durum deiikliine yol amayan kodlara etkisiz kodlar (code has no effect) denir. Etkisiz kod
oluturmak Java'da genel olarak geersizdir. Etkisiz kodlar derleme zamannda hata (error) oluturur.
Ancak
++a; //Geerli
foo() // Geerli
a = 10 //error
b = 20;
fadeleri sonlandran bu tr atomlara sonlandrc (terminator) denmektedir. Baz dillerde ENTER karakteri
sonlandc atom olarak kullanlr. Bu dillerde her satra tek bir ifade yazlmak zorundadr. rnein BASIC
programlama dili bu ekildedir. Java 'da sonlandrc noktal virgldr.