Десять негритят отправились обедать,
Один поперхнулся, их осталось девять.
Девять негритят, поев, клевали носом,
Один не смог проснуться, их осталось восемь.
Восемь негритят в Девон ушли потом,
Один не возвратился, остались всемером.
Семь негритят дрова рубили вместе,
Зарубил один себя — и осталось шесть их.
Шесть негритят пошли на пасеку гулять,
Одного ужалил шмель, их осталось пять.
Пять негритят судейство учинили,
Засудили одного, осталось их четыре.
Четыре негритенка пошли купаться в море,
Один попался на приманку, их осталось трое.
Трое негритят в зверинце оказались,
Одного схватил медведь, и вдвоем остались.
Двое негритят легли на солнцепеке,
Один сгорел — и вот один, несчастный, одинокий.
Последний негритенок поглядел устало,
Он пошел, повесился, и никого не стало…
вторник, 23 января 2007 г.
Телефон - радио
Не писал об этом еще?
Рассказывал тут на работе, как во время ремонта к телефонным розеткам подвели кабель от радиосети. Телефон сначала просто висит, потом звонить начинает. Видимо частоты совпали. Снимаешь трубку - он бубнит. Пашка - свидетель. Это он высказал идею, что ремонтники могли радио подключить. Я бы не догадался, так как бубнил телефон очень неразборчиво...
Рассказывал тут на работе, как во время ремонта к телефонным розеткам подвели кабель от радиосети. Телефон сначала просто висит, потом звонить начинает. Видимо частоты совпали. Снимаешь трубку - он бубнит. Пашка - свидетель. Это он высказал идею, что ремонтники могли радио подключить. Я бы не догадался, так как бубнил телефон очень неразборчиво...
Арройо
Вычитал, что по испански это значит пересохшее русло реки. Вполне понятно, почему так деревня в FallOut 2 называлась. Вспомните мост через это русло...
Ручкой в руку
Смотрел фильм Nikita (1990) Люка Бессона. Обратил внимание на момент, когда героиня хватает со стола ручку и втыкает ее полицейскому в руку. Вспомнил аналогичный момент в фильме DeadMan (1995) Джима Джарамуша, когда Джонни Депп втыкает перьевую ручку миссионеру. Задумался, кто у кого стырил идею. Залез на IMDB и уточнил года. Выходит, что эта идея Люка Бессона? Никто не видел ее раньше?
Виадук на Стачек
Интересно, когда построили виадук на Стачек возле метро Автово? Мне тут сказали, что лет 5 назад чел там ездил и стоял, пропуская поезд. У меня же такое чувство, что ему лет двадцать. По крайней мере, я его помню, когда из общаги на толпу ездили. Или же я его путаю с мостом на Жукова, рядом с Казакова...
Кирилл прошелся по Европе
Был на выходных в Таллинне. Слушал радио. В Пярну наводнение. Скоро до нас Кирилл дойдет?
четверг, 18 января 2007 г.
Java Puzzle 12: ABC
String letters = "ABC";
char[] numbers[] = {'1', '2', '3'};
System.out.print(letters + " easy as " + numbers);
Что будет напечатано?
А если попробовать так:
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
то будет ожидаемый результат:
ABC easy as 123
А с небольшим изменением:
String letters = "ABC";
Object numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
результат опять будет неправильным.
Дело в том, что при конкатенации строк используется метод toString(). А массив символов, как и любой другой массив, не переопределяет этот метод. В то же время, класс PrintStream определяет метод print(char[]), который корректно выводит символы в поток. Однако, в третьем случае вызывается метод print(Object), который несмотря на то, что аргумент - массив символов, вызывает у него метод toString().
Для преобразования массива символов к строке авторы рекомендуют использовать метод String.valueOf(char[]).
char[] numbers[] = {'1', '2', '3'};
System.out.print(letters + " easy as " + numbers);
Что будет напечатано?
А если попробовать так:
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
то будет ожидаемый результат:
ABC easy as 123
А с небольшим изменением:
String letters = "ABC";
Object numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
результат опять будет неправильным.
Дело в том, что при конкатенации строк используется метод toString(). А массив символов, как и любой другой массив, не переопределяет этот метод. В то же время, класс PrintStream определяет метод print(char[]), который корректно выводит символы в поток. Однако, в третьем случае вызывается метод print(Object), который несмотря на то, что аргумент - массив символов, вызывает у него метод toString().
Для преобразования массива символов к строке авторы рекомендуют использовать метод String.valueOf(char[]).
Java Puzzle 11: The Last Laugh
Рассмотрим следущие выражения:
System.out.print("H" + 'a');
System.out.print('H' + 'a');
Результат первого: "Ha", а второго - 169. Причем тип второго выражения int. Вывод: оператор + выполняет конкатенацию строк только если один из операндов является строкой.
System.out.print("H" + 'a');
System.out.print('H' + 'a');
Результат первого: "Ha", а второго - 169. Причем тип второго выражения int. Вывод: оператор + выполняет конкатенацию строк только если один из операндов является строкой.
среда, 17 января 2007 г.
Java Puzzle 10: Tweedledee
Напишите декларации переменных x и i так, чтобы следующий оператор компилился:
x = x + i;
а следующий оператор - нет:
x += i;
Тут тоже проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
Object x = "X";
String i = "I";
Cледующий оператор компилится:
x = x + i; // создается новая строка
а следующий оператор - нет:
x += i; // нельзя сложить два объекта
x = x + i;
а следующий оператор - нет:
x += i;
Тут тоже проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
Object x = "X";
String i = "I";
Cледующий оператор компилится:
x = x + i; // создается новая строка
а следующий оператор - нет:
x += i; // нельзя сложить два объекта
Java Puzzle 9: Tweedledum
Напишите декларации переменных x и i так, чтобы следующий оператор компилился:
x += i;
а следующий оператор - нет:
x = x + i;
Многие думают, что проблема с классом String, а на самом деле проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
short x = 0;
int i = 123456;
Cледующий оператор компилился:
x += i; // скрытое приведение типов
а следующий оператор - нет:
x = x + i; // ошибка: possible lost of precision
Короче, если не хотите неожиданных проблем - не используйте составные операторы присваивания для типов byte, short или char.
x += i;
а следующий оператор - нет:
x = x + i;
Многие думают, что проблема с классом String, а на самом деле проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
short x = 0;
int i = 123456;
Cледующий оператор компилился:
x += i; // скрытое приведение типов
а следующий оператор - нет:
x = x + i; // ошибка: possible lost of precision
Короче, если не хотите неожиданных проблем - не используйте составные операторы присваивания для типов byte, short или char.
Java Puzzle 8: Dos Equis
Рассмотрим следующий пример:
char x = 'X';
System.out.print( true ? x : 0 );
int i = 0;
System.out.print( true ? x : i );
Что будет напечатано в обоих случаях?
Почему в первом случае будет напечатано X, а во втором - 88? Читайте Java Language Specification 15.25
Ссылаясь на Puzzle 5, авторы рекомендуют не смешивать разные типы при вычислении. Нужно быть уверенным, что для второго и третьего операнда условного оператора используются значения одного типа.
char x = 'X';
System.out.print( true ? x : 0 );
int i = 0;
System.out.print( true ? x : i );
Что будет напечатано в обоих случаях?
Почему в первом случае будет напечатано X, а во втором - 88? Читайте Java Language Specification 15.25
Ссылаясь на Puzzle 5, авторы рекомендуют не смешивать разные типы при вычислении. Нужно быть уверенным, что для второго и третьего операнда условного оператора используются значения одного типа.
Java Puzzle 7: Swap Meat
Тут рассказывается про технику обмена значениями без введения новой переменной.
x = 1984;
y = 2001;
x ^= y^= x ^= y;
Каков же будет результат?
x = 0;
y = 1984;
Проблема в том, что приведенное выше сокращение работает не так, как следующие операторы:
x ^= y;
y ^= x;
x ^= y;
Это происходит из-за того, что операнды операторов вычисляются слева направо. Если вы хотите записать в одну строку - расставьте правильно скобки:
y = ( x ^= ( y ^= x ) ) ^ y;
И вообще, я рекомендую всегда использовать скобки и не полагаться на приоритет операндов.
Авторы советуют никогда не присваивать значение одной и той же переменной несколько раз в одном выражении. И рекомендуют избегать умных программерских трюков...
x = 1984;
y = 2001;
x ^= y^= x ^= y;
Каков же будет результат?
x = 0;
y = 1984;
Проблема в том, что приведенное выше сокращение работает не так, как следующие операторы:
x ^= y;
y ^= x;
x ^= y;
Это происходит из-за того, что операнды операторов вычисляются слева направо. Если вы хотите записать в одну строку - расставьте правильно скобки:
y = ( x ^= ( y ^= x ) ) ^ y;
И вообще, я рекомендую всегда использовать скобки и не полагаться на приоритет операндов.
Авторы советуют никогда не присваивать значение одной и той же переменной несколько раз в одном выражении. И рекомендуют избегать умных программерских трюков...
Преферанс
На выходных играли в преф по рублю за вист. Проиграл 156 рублей. Как давно я не брал в руки карт!!!
вторник, 16 января 2007 г.
Java Puzzle 6: Multicast
Что напечатает следующий оператор:
System.out.println((int) (char) (byte) -1)?
Ответ 65535 (для наглядности 0x0000FFFF)
Знаковое расширение происходит только тогда, когда тип значения был знаковый. В данном случае расширения знакового разряда не выполняется.
Умный совет дают авторы: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.
Короче, пишите проще.
System.out.println((int) (char) (byte) -1)?
Ответ 65535 (для наглядности 0x0000FFFF)
Знаковое расширение происходит только тогда, когда тип значения был знаковый. В данном случае расширения знакового разряда не выполняется.
Умный совет дают авторы: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.
Короче, пишите проще.
Java Puzzle 5: The Joy of Hex
Чему равно 0x100000000L + 0xCAFEBABE?
Прикол в том, что второе число типа int и расширяется знаковым разрядом до следующего long: 0x0000000100000000L + 0xFFFFFFFFCAFEBABEL = 0x00000000CAFEBABE.
Чему равно 0x100000000L + 0xCAFEBABEL?
В результате получим ожидаемое 0x00000001CAFEBABE.
Авторы дают совет избегать вычислений с аргументами разных типов.
Прикол в том, что второе число типа int и расширяется знаковым разрядом до следующего long: 0x0000000100000000L + 0xFFFFFFFFCAFEBABEL = 0x00000000CAFEBABE.
Чему равно 0x100000000L + 0xCAFEBABEL?
В результате получим ожидаемое 0x00000001CAFEBABE.
Авторы дают совет избегать вычислений с аргументами разных типов.
Футураметр
Результат теста «На кого из героев „Футурамы“ ты похож»:
Если Вы желаете узнать больше о своем характере и о характере героев «Футурамы», то прочитайте статью «Псих-о-рама».
Пройти тест.
Проф. | Лила | Гермес | Бендер | Зойдберг | Фрай | Эми | Киф | Зепп |
| 1 | 4 | -1 | 3 | 4 | 0 | 7 | 3 | 3 |
Если Вы желаете узнать больше о своем характере и о характере героев «Футурамы», то прочитайте статью «Псих-о-рама».
Пройти тест.
Java Puzzle 4: It's Elementary
Тут авторы советуют всегда использовать заглавную букву L для long-литералов: 5432L вместо 5432l, которое похоже на 54321. Я давно пишу заглавные буквы в long- и float-литералах, а также в шестнадцатиричной записи: 0xABCD вместо 0xabcd.
Так же они рекомендуют избегать однобуквенного идентификатора l, который легко спутать с единицей. Это правило меня не касается, так как я всегда предпочитаю использовать длинные названия, содержащие какой-либо смысл. Однобуквенные идентификаторы, которые я использую: x, y, z для координат и i, j, k... для счетчиков циклов.
Так же они рекомендуют избегать однобуквенного идентификатора l, который легко спутать с единицей. Это правило меня не касается, так как я всегда предпочитаю использовать длинные названия, содержащие какой-либо смысл. Однобуквенные идентификаторы, которые я использую: x, y, z для координат и i, j, k... для счетчиков циклов.
Подписаться на:
Сообщения (Atom)