Java Puzzle 18 – Increment in Loop
Merhaba Arkadaslar
Hemen ornek kodumuzu inceleyelim ;
Dongu icerisinde j degiskenini artirip kendisine assign ediyoruz.
package _18.increment.inloop; public class Increment { public static void main(String[] args) { int j = 0; for (int i = 0; i < 100; i++) j = j++; System.out.println(j); } }
Kodu inceledigimizde output olarak 100 yazmasini bekliyoruz.
for dongusu 100 kere donmekte ve j++ islemi de 100 kere olmaktadir ve her artis sonrasi kendisine atiyoruz.
Peki ornegi calistirdigimizda output ne olacak ?
0
Peki neden ?
Bunun nedeni ++ increment operator’u burada postfix olarak kullanildi.increment operatoru postfix olarak kullanildiginda en son olarak calisir. Burada assignment operatoru once calisacaktir ( = ) sonrasinda ++ operatoru calisacaktir.
Adim 1 ;
j degeri 0 , ++ operatorunden once assignment yapilacak.
increment islemi sonrasi 1 olacak fakat bu deger havada kalacaktir.
Dolayisiyla j degeri sonuc olarak 0 olacaktir.
Bu ifade ;
j = j++;
Aslinda su ifadelere karsilik gelmektedir ;
int temp = j; j = j + 1; j = temp;
Bu problemi cozmek icin extra kullandigimiz/gereksiz assignment operatorunu kaldiralim.
package _18.increment.inloop; public class IncrementFixed { public static void main(String[] args) { int j = 0; for (int i = 0; i < 100; i++) { j++; } System.out.println(j); } }
Peki
j = j++; yerine j = ++j;
kullansak ? Bu durumda increment operatoru prefix olacaktir. Yani ilk olarak increment islemi yapilir sonrasinda assignment yapilir.
Fakat bu tarz cirkin kodlar yazmayalim. Amacimiz temiz kod olmali isleri karistirmak yerine olabildigince anlasilir olmalidir.
Everything should be made as simple as possible, but not simpler.
Her şey mümkün olduğunca sadeleştirilmeli, fakat basitleştirilmemelidir.
Albert Einstein
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply