суббота, 1 сентября 2007 г.

Java Puzzle 31: Ghost of Looper

А как насчет такого цикла:
while (i != 0) i >>>= 1;
Сделаете его бесконечным?

Судя по оператору сдвига i должно быть целочисленным. А для присвоения используется составной оператор. Вот оно! Согласно JLS 15.26.2 такие операторы втихомолку выполняют сужающее преобразование примитивных типов. Согласно JLS 5.1.13 такое преобразование может терять информацию о величине или точности числовых значений. Вот и ответ:
short i = -1; // или byte

Вкратце: 0xFFFF != 0 и мы заходим в цикл. Так как оператор сдвига реализован только для типов int и long мы получаем 0xFFFF -> 0xFFFFFFFF -> 0x7FFFFFFF -> 0xFFFF. Тут мы и зацикливаемся. Авторы советуют не использовать составные операторы присвоения для типов short, byte или char.

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

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