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

Print Friendly

Leave a Reply

Your email address will not be published. Required fields are marked *