Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Обратная реализация квадратного корня в Quake 3:
float InvSqrt (float x){
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
Обновление: , Как это работает (благодарит ryan_s)
unsigned int reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}
Реверсы порядок битов в интервале
Я знаю, что это - C и не C++, но всегда существует Международный Запутываемый Конкурс Кода C . Я видел некоторый код там, который заставил бы Вашу голову кружиться.
Это - известный но все еще впечатляющий способ подкачать два целых числа, не создавая временную переменную:
// a^=b^=a^=b; // int a and int b will be swapped
// Technically undefined behavior as variable may only
// be assined once within the same statement.
//
// But this can be written correctly like this.
// Which still looks cool and unreadable ;-)
a^=b;
b^=a;
a^=b;
C, но существующий в C++, я нахожу, что оператор запятой действительно запутывает код, возьмите это...
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
Краткий и довольно изящный, но очень легкий отсутствовать или неправильно понять.
Устройство вареного пудинга ( http://en.wikipedia.org/wiki/Duff%27s_device ) дает мне кошмары:
strcpy(to, from, count)
char *to, *from;
int count;
{
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
Это недавно было на reddit http://www.eelis.net/C++/analogliterals.xhtml
assert((o-----o
| !
! !
! !
! !
o-----o ).area == ( o---------o
| !
! !
o---------o ).area );
Большая часть материала Повышения - шаблонное метапрограммирование достаточно плохо, но когда Вы включаете в обходные решения, необходимые, чтобы заставить это работать над некоторыми компиляторами (*coughborlandcough*), это становится довольно смешным. Просто попытайтесь понять Повышение. Связать. Просто попробуйте.
Двоичный сдвиг смущает меня все время. Пример от java.util.concurrent.ConcurrentHashMap
пакет:
return ((h << 7) - h + (h >>> 9) + (h >>> 17))
Я голосую за некоторое шаблонное метапрограммирование black-magic-hackerish (к сожалению, не имеют никого под рукой для регистрации его).