修改Duff设备的语法 - 这是合法的C/C++吗?

mon*_*506 8 c++ switch-statement duffs-device

就在昨晚,我第一次遇到了好奇的Duff设备.我一直在做一些阅读,我不认为这是令人生畏的理解.我很好奇的是奇怪的语法(来自维基百科):

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在阅读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);
  }
}
Run Code Online (Sandbox Code Playgroud)

对我而言,这使得代码的意图更加清晰.感谢您的任何反馈.;)

编辑:如下所述,原始代码是为C编写的,并且对countn变量有隐式int .因为我标记了它C++我修改了它.

编辑2:修改修改后的示例代码以考虑无效计数值.

Ben*_*igt 8

看看C++ 11标准,我认为你要问的代码部分是允许的.你试过吗?

我认为最适用的规则是:

注意: 通常,作为开关主题的子语句是复合的,case并且default标签出现在(复合)子语句中包含的顶级语句中,但这不是必需的.

事实上,这意味着你可以摆脱do- 围绕- while和写

  int n = (count + 7) / 8;
  switch (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++;
  } while(--n > 0);
Run Code Online (Sandbox Code Playgroud)

但是,这一行不是有效的C++:

register n = (count + 7) / 8;
Run Code Online (Sandbox Code Playgroud)

C++不允许使用default-int,必须指定或推断变量的类型.


哦,在这里,修复迭代次数而不破坏格式:

  int n = 1 + count / 8;
  switch (count % 8) 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++;
      case 0:                      ;
  } while(--n > 0);
Run Code Online (Sandbox Code Playgroud)

  • 我想知道`switch` -`do`语句现在是否会被添加到鲜为人知的C/C++特性列表中,就像方法操作符`< - `和转到操作符` - >`一样. (2认同)