【问题标题】:Obscure C construct on interlaced switch隔行开关上的模糊 C 结构
【发布时间】:2017-02-23 10:36:03
【问题描述】:

我在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);
    }
}

当主循环块位于case 0 时,控制如何达到case 5? 它在语法上如何正确?另外,为什么 case 语句中的变量声明仅限于块范围?

[编辑]

引用同一页中的行,“...C 编程语言的第一版,它只要求 switch 的主体是语法上有效的(复合)语句,其中 case 标签可以出现在任何子语句的前缀...”。

我相信这是一个答案,但是为什么大师们会选择这样做呢?

【问题讨论】:

  • in the Wikipedia article 的解释还不足以描述它的工作原理吗?并且 comment 不在 Wikipedia 中,所以你从哪里复制了这个 sn-p?
  • 我为我的问题的第二部分添加了它。
  • 因为他们不是“大师”,他们是先驱。那里有很大的不同。根据定义,建造第一所房子的人并不是历史上最好的建筑商。一般而言,K&R 对适当的程序设计一无所知。

标签: c syntax switch-statement do-while


【解决方案1】:

这个成语被称为Duff's Device,它取决于switch/case 是goto 的一个非常薄抽象。

在 C 中,允许从外部跳转到这样的块内部(尽管如果这样做会错过任何变量初始化,好的编译器会发出警告)。

【讨论】:

  • 非常有见地,很好的答案。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2013-10-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多