我在 Duff's Device
的维基百科页面上看到了这个语法。
该页面提到,在这种情况下,这种构造有助于满足一些模除法要求,尤其是 8,如下所示:
send(to, from, count)
register short *to, *from;
register count;
{
register 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++; /* {int somevar =0;} */
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
当主循环 block 处于 case 0
时,控制如何到达 case 5
?
它在语法上如何正确?另外,为什么 case 语句中的 then 变量声明仅限于 block 作用域?
[编辑]
引用同一页中的几行,“...C 编程语言的第一版只要求 switch 的主体是语法上有效的(复合)语句,其中 case 标签可以出现在任何子语句的前缀中……”。
我相信这是一个答案,然而,为什么大师们选择这样做呢?
最佳答案
那个成语被称为Duff's Device ,并且取决于 switch/case
是 非常 goto
的精简抽象这一事实。
在 C 中,允许像这样从 block 外跳转到 block 内(尽管如果这样做会错过任何变量初始化,好的编译器会发出警告)。
关于c - 交错开关上的模糊 C 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42413260/