четверг, 6 сентября 2007 г.

Java Puzzle 35: Minute by Minute

Следующая программа имитирует простые часы:
int minutes = 0;
for (int ms = 0; ms < 60*60*1000; ms++)
    if (ms % 60*1000 == 0)
        minutes++;
Программа считае миллисекунды, добавляя время от времени минуты. И чему будет равно количество минут в конце цикла?

А вот и нет! В часе получается не 60 минут, а 60000. А проблема в том, что % и * равнозначные операторы. Т.е. сначала выполняется ms % 60, и 0 тут получается гораздо чаще, чем ms % (60*1000). Как сделать правильно? Заменить все магические числа на константы:
int MS_PER_HOUR = 60 * 60 * 1000;
int MS_PER_MINUTE = 60 * 1000;
int minutes = 0;
for (int ms = 0; ms < MS_PER_HOUR; ms++)
    if (ms % MS_PER_MINUTE == 0)
        minutes++;

Пользователей може запутать, что вокруг % находятся пробелы, а вокруг * - нет. Компилятору до них никакого дела нет. Никогда не используйте пробелы для группировки операторов. Используйте скобки!

Комментариев нет:

Отправить комментарий