c - 交错开关上的模糊 C 构造

标签 c syntax switch-statement do-while

我在 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/

相关文章:

c++ - 需要帮助确定输入的字符是符号、数字还是字母

javascript - 中断应该在条件 block 内,即我们的外部吗?

CLion 错误 : Configuration is not specified

c++ - 通过c中的指针传递二维数组时出错

c - 字符串长度有限的 strtod

c# - 波浪号在表达式中是什么意思?

javascript - 使用 JavaScript 自动导航到一组页面列表

c - 搜索包含转义字符的字符串

Javascript/JQuery if 语句

syntax - 语法定向翻译是什么意思?