昨晚我第一次遇到了奇怪的达夫设备。我已经阅读了一些相关资料,我认为它并不难理解。但我对其中的奇怪语法很好奇(来自维基百科):
register short *to, *from;
register int count;
{
register 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);
}
}
我正在阅读C++标准中有关switch语句的定义(如果过时了,请告知我,我不熟悉Open-Std.org)。据我所理解,case语句只是由switch语句使用的简化跳转语句。
switch本身完全忽略了嵌套do-while,而循环则忽略了case语句。因为switch在循环内进行跳转,所以循环被执行。switch用于处理剩余部分(通过8的除法得到),而循环则处理均匀可被整除的部分。这一切都很合理。
我的问题是为什么会出现这样笨拙的语法?我想到的是循环可以被写成包含所有case语句的形式,是这样吗?我在标准中没有看到任何禁止这种行为的内容,并且它在GCC 4.7下编译正确,那么以下代码是否被认为是合法的呢?
register short *to, *from;
register int count;
{
register int n = (count + 7) / 8;
switch (count <= 0 ? 8 : count % 8)
{
do
{
case 0: *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++;
default: ; // invalid count, suppress warning, etc.
} while(--n > 0);
}
}
对我来说,这使得代码的意图更加清晰。感谢任何反馈。;)
编辑:如下所述,原始代码是用C编写的,count和n变量具有隐式int类型。由于我标记了它为C ++,因此我进行了修改。
编辑2: 修改了示例代码以解决无效计数值的问题。
int
。 (Duff在C99之前就设计了他的设备。) - Keith Thompsonswitch
-do
语句是否会像操作符<--
和-->
一样被添加到C/C++的鲜为人知的特性列表中。 - Ben Voigt&&&
运算符。 - Keith Thompson