所以在我们大学,他们一直在咖啡杯上打印出以下代码:
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++;
}
据我所知,它做同样的事情,除非有我遗漏的东西?
答案 0 :(得分:11)
你不知道这是有名的,它被称为Duff's device。我会说代码历史学家和语言律师主要感兴趣。
它是意外但有效的C语法的一个很好的例子,这使它很有趣。它也是优化复制循环的有效方法,实际上是手动展开它,而不是依靠编译器来实现。
对于现代编译器,我认为这是毫无意义的,但我还没有对其进行测试。维基百科页面暗示它在当前代码中毫无意义。
它(当然)比同等的简单字节复制循环更难理解,所以这是一个很大的减号。如果它出现在我审查的代码中,我会不高兴。 :)