среда, 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; // нельзя сложить два объекта

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.

Язык D

Забавный язык народ придумал ;-)

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, авторы рекомендуют не смешивать разные типы при вычислении. Нужно быть уверенным, что для второго и третьего операнда условного оператора используются значения одного типа.

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;
И вообще, я рекомендую всегда использовать скобки и не полагаться на приоритет операндов.
Авторы советуют никогда не присваивать значение одной и той же переменной несколько раз в одном выражении. И рекомендуют избегать умных программерских трюков...

Преферанс

На выходных играли в преф по рублю за вист. Проиграл 156 рублей. Как давно я не брал в руки карт!!!