在大学里混淆和过于复杂的代码示例

时间:2017-05-23 12:46:03

标签: c++ c

所以在我们大学,他们一直在咖啡杯上打印出以下代码:

void f(char *x, char*y, int z)
{
    int z2 = (z + 7) / 8;
    switch (z % 8)
    {
        case 0:
        do 
        {
            *x++ = *y++;
        case 7:
            *x++ = *y++;
        case 6:
            *x++ = *y++;
        case 5:
            *x++ = *y++;
        case 4:
            *x++ = *y++;
        case 3:
            *x++ = *y++;
        case 2:
            *x++ = *y++;
        case 1:
            *x++ = *y++;
            } while (--z2 > 0);
    }
}

运行它,我发现它只是从z指向的地址复制y个字节到x指向的地址。 在我看来,代码似乎是不必要的复杂和丑陋,switch语句,特别是从do while开始并以case 0结尾的令人困惑的case 1循环。 简单的for循环是不是足够了? :

void ff(char *x, char *y, int z)
{
    for (int i = 0; i < z; i++)
        *x++ = *y++;
}

据我所知,它做同样的事情,除非有我遗漏的东西?

1 个答案:

答案 0 :(得分:11)

你不知道这是有名的,它被称为Duff's device。我会说代码历史学家和语言律师主要感兴趣。

它是意外但有效的C语法的一个很好的例子,这使它很有趣。它也是优化复制循环的有效方法,实际上是手动展开它,而不是依靠编译器来实现。

对于现代编译器,我认为这是毫无意义的,但我还没有对其进行测试。维基百科页面暗示它在当前代码中毫无意义。

它(当然)比同等的简单字节复制循环更难理解,所以这是一个很大的减号。如果它出现在我审查的代码中,我会不高兴。 :)