Напишите декларации переменных x и i так, чтобы следующий оператор компилился:
x = x + i;
а следующий оператор - нет:
x += i;
Тут тоже проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
Object x = "X";
String i = "I";
Cледующий оператор компилится:
x = x + i; // создается новая строка
а следующий оператор - нет:
x += i; // нельзя сложить два объекта
среда, 17 января 2007 г.
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... для счетчиков циклов.
Java Puzzle 3: Long Division
Когда работаете с большими числами, ищите переполнение. Приведенный пример показывает, что часто это случается с умножением и делением чисел, а также с неявным преобразованием:
public class LongDivision {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
public static void main(String[] args) {
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
}
}
public class LongDivision {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
public static void main(String[] args) {
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
}
}
понедельник, 15 января 2007 г.
Наводнение
А здесь можно посмотреть фотки наводнения, которое произошло этой зимой. Больше все мне понравилась циничная надпись "С Новым Годом!" и фотография чмжика-пыжика под водой...
пятница, 12 января 2007 г.
Java Puzzle 2: Time for a Change
Оказывается, 2.00 - 1.10 не равно 0.90.
Не рекомендуется использовать float и double для расчетов чего-нибудь важного. Надо использовать BigDecimal(String), но ни в коем случае не использовать BigDecimal(double).
Кроме того, тут рекомендуют использовать форматтеры для вывода чисел.
Не рекомендуется использовать float и double для расчетов чего-нибудь важного. Надо использовать BigDecimal(String), но ни в коем случае не использовать BigDecimal(double).
Кроме того, тут рекомендуют использовать форматтеры для вывода чисел.
Java Puzzle 1: Oddity
boolean isOdd( int i ) {
return i % 2 == 1;
}
Тут описывается проблема остатка от деления (оператор %).
Выражение ( i % 2 == 1 ) не работает для отрицательных чисел, так как там остаток от деления равен -1. Рекомендуют использовать выражение ( i % 2 != 0 ).
return i % 2 == 1;
}
Тут описывается проблема остатка от деления (оператор %).
Выражение ( i % 2 == 1 ) не работает для отрицательных чисел, так как там остаток от деления равен -1. Рекомендуют использовать выражение ( i % 2 != 0 ).
javadoc - codavaj
Забавный проект.
Позволяет сгенерировать java-код по ранее сгенерированному javadoc.
Позволяет сгенерировать java-код по ранее сгенерированному javadoc.
среда, 10 января 2007 г.
Задачка
Для собеседования у нас придумали задачку: реализовать XOR через AND, OR и NOT. В связи с тем, что я подзабыл булеву алгебру, я решал ее минут 10, включая составление проверочной таблицы.
Для наглядности предлагается использовать блоки с двумя входами и одним выходом для AND и OR, или один вход и один выход для NOT. У меня получилось 4 блока.
А вам слабо?
Для наглядности предлагается использовать блоки с двумя входами и одним выходом для AND и OR, или один вход и один выход для NOT. У меня получилось 4 блока.
А вам слабо?
Подписаться на:
Сообщения (Atom)