你知道什么是最难理解的C ++代码?

时间:2008-10-07 12:45:58

标签: c++

今天在工作中,我们遇到了以下代码(有些人可能会认出来):

#define GET_VAL( val, type ) \
    {                                                   \
        ASSERT( ( pIP + sizeof(type) ) <= pMethodEnd ); \
        val = ( *((type *&)(pIP))++ );                  \
    }

基本上我们有一个字节数组和一个指针。宏返回对类型变量的引用,并将指针前进到该变量的末尾。

它让我想起了几次我需要“像解析器一样思考”才能理解C ++代码。

您是否知道其他代码示例导致您多次停止并阅读它,直到您设法了解它的设想?

11 个答案:

答案 0 :(得分:36)

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;
}

<强>更新 How this works(感谢ryan_s)

答案 1 :(得分:27)

最近在reddit上http://www.eelis.net/C++/analogliterals.xhtml

 assert((o-----o
        |     !
        !     !
        !     !
        !     !
        o-----o ).area == ( o---------o
                            |         !
                            !         !
                            o---------o ).area );

答案 2 :(得分:15)

达夫的装置(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);
    }
}

答案 3 :(得分:11)

我知道它是C而不是C ++,但始终是International Obfuscated C Code Contest。我在那里看到了一些会让你头晕目眩的代码。

答案 4 :(得分:10)

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中的位顺序。

答案 5 :(得分:9)

这是众所周知但仍然令人印象深刻的方式来交换两个整数而不创建临时变量:

// 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;

答案 6 :(得分:6)

大多数Boost东西 - 模板元编程很糟糕,但是当你考虑到让它在某些编译器(* coughborlandcough *)上工作所需的变通方法时,它就变得非常荒谬了。试着去了解Boost.Bind。试试吧。

答案 7 :(得分:2)

C,但是在C ++中,我发现逗号运算符真的混淆了代码,拿这个......

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);

Terse,相当优雅,但很容易错过或误解。

答案 8 :(得分:1)

任何前缀为:

的内容

/* You are not expected to understand this */

答案 9 :(得分:0)

二进制班让我一直困扰着我。 java.util.concurrent.ConcurrentHashMap包中的示例:

return ((h << 7) - h + (h >>> 9) + (h >>> 17))

答案 10 :(得分:-3)

我投票支持一些黑魔法 - 黑客模板元编程(很遗憾没有任何手头发布它)。