就在昨晚,我第一次遇到了好奇的达夫装置。我一直在阅读它,我认为理解它并不令人生畏。我很好奇的是奇怪的语法(来自维基百科):
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);
}
}
我正在阅读switch 语句的 C++ 标准定义(如果它已经过时,请告诉我,我不熟悉 Open-Std.org)。据我所知,case 语句只是用于 switch 语句的简化跳转语句。
switch 本身完全忽略了嵌套的 do-while,循环忽略了 case 语句。由于开关在循环内部跳转,因此循环被执行。开关用于覆盖余数(除以 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:修改了修改后的示例代码以解决无效的计数值。