Java Puzzle 27 – Precedence
Merhaba Arkadaslar
Ornek kodumuzu inceleyelim ;
Clock.java
public class Clock { public static void main(String[] args) { int minutes = 0; for (int ms = 0; ms < 60 * 60 * 1000; ms++) if (ms % 60 * 1000 == 0) minutes++; System.out.println(minutes); } }
60*60*1000 -> 3,600,000 yapacaktir bu deger int sinirinin icerisindedir , bu acidan herhangi bir problem yok.
60*1000 da -> 60,000 olacaktir.
mod alma islemi icin ilgili sartinin saglandigi ;
3,600,000 /60.000 -> 60 kere olacaktir.
Dolayisiyla if sarti 60 kere saglanacaktir ve minitues 60 olacaktir.
Peki gercekten ciktimiz 60 mi olur , ornegi calistirdigimizda 60,000 olacaktir. Peki bu nasil olmaktadir ?
Bunun nedeni su ifadedir ;
(ms % 60 * 1000 == 0)
remainder operatoru/mod operatoru (%) ile carpma operatoru/multiplication operator ayni oncelige (predence) sahiptir.
(ms % 60) * 1000
Dolayisiyla her 60,000 iteration da degil her 60 iteration da bir if sarti saglanacaktir.
Problemi fixlemek icin parantez kullanmamiz gereklidir.
if (ms % (60 * 1000) == 0)
ClockPrecedenceParentheses.java
public class ClockPrecedenceParentheses { public static void main(String[] args) { int minutes = 0; for (int ms = 0; ms < 60 * 60 * 1000; ms++) if (ms % (60 * 1000) == 0) //bugfixed minutes++; System.out.println(minutes); } } }
Daha iyi bir yol olarak karisikligi onlemek icin contant degerleri bir degiskende tanimlayabiliriz.
package _27.precedence; public class QualityClock { // better way to fix, private static final int MS_PER_HOUR = 60 * 60 * 1000; private static final int MS_PER_MINUTE = 60 * 1000; public static void main(String[] args) { int minutes = 0; for (int ms = 0; ms < MS_PER_HOUR; ms++) if (ms % MS_PER_MINUTE == 0) minutes++; System.out.println(minutes); } }
Github kaynak kodlar / Source Code ;
leventerguder/injavawetrust-puzzler
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