Что самое трудное для понимания кода С++, который вы знаете?
Сегодня на работе мы натолкнулись на следующий код (некоторые из вас могут его распознать):
#define GET_VAL( val, type ) \
{ \
ASSERT( ( pIP + sizeof(type) ) <= pMethodEnd ); \
val = ( *((type *&)(pIP))++ ); \
}
В основном мы имеем массив байтов и указатель. Макрос возвращает ссылку на переменную типа и продвигает указатель до конца этой переменной.
Это напомнило мне несколько раз, что мне нужно было "думать как парсер", чтобы понять код на С++.
Знаете ли вы о других примерах кода, которые заставили вас остановиться и прочитать его несколько раз, пока вам не удалось понять, что он должен делать?
Ответы
Ответ 1
реализация обратного квадратного корня в 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;
}
Update:
Как это работает (спасибо ryan_s)
Ответ 2
Это недавно было reddit http://www.eelis.net/C++/analogliterals.xhtml
assert((o-----o
| !
! !
! !
! !
o-----o ).area == ( o---------o
| !
! !
o---------o ).area );
Ответ 3
Устройство Duff (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);
}
}
Ответ 4
Я знаю это C, а не С++, но всегда существует Международный конкурс Obfuscated C Code. Я видел там какой-то код, который заставил бы вашу голову вращаться.
Ответ 5
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));
}
Отменяет порядок бит в int.
Ответ 6
Это хорошо известный, но все же впечатляющий способ обмена двумя целыми числами без создания временной переменной:
// 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;
Ответ 7
Большинство файлов Boost - метапрограммирование шаблона достаточно плохое, но когда вы учитываете обходные пути, необходимые для работы над некоторыми компиляторами (* coughborlandcough *), это становится довольно смешно. Просто попробуйте понять Boost.Bind. Просто попробуйте.
Ответ 8
C, но присутствует в С++, я считаю, что оператор запятой действительно запутывает код, возьмите это...
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
Тесный и довольно элегантный, но очень легко пропустить или понять неправильно.
Ответ 9
Все, что префикс:
/* Вы не должны понимать это */
Ответ 10
Двоичные смены меня все время путают:
Пример из java.util.concurrent.ConcurrentHashMap:
return ((h < 7) - h + (h → > 9) + (h → > 17))
Ответ 11
Я проголосую за метапрограммирование черной магии и хакерских шаблонов (к сожалению, у него нет наготове, чтобы опубликовать его).