【问题标题】:C switch statement with do-while interleaved [duplicate]带有do-while交错的C switch语句[重复]
【发布时间】:2012-03-07 03:04:09
【问题描述】:

可能重复:
How does Duff's device work?

我试图了解这是如何工作的。任何帮助将不胜感激。

#include<stdio.h>

void duff(int count)
  {
      int n=(count+7)/8;
      printf("n=%d  count =%d\n",n,count%8);
      switch(count%8){
      case 0: do{ printf("case 0\n");
      case 7:  printf("case 7\n");
      case 6: printf("case 6\n");
      case 5: printf("case 5\n");
      case 4: printf("case 4\n");
      case 3: printf("case 3\n");
      case 2: printf("case 2\n");
      case 1: printf("case 1\n");
              }while( --n >0);
      }
  }

main(){
int count;
scanf("%d",&count);
duff(count);

}

基本上,如果 switch case 的计算结果为 case 语句 2,那么 while 的 do 语句永远不会执行。但是我运行了这个程序,它给了我输出,但无法解释:
输出:

3
n=1 计数 =3
案例3
案例2
案例一

【问题讨论】:

    标签: c switch-statement do-while duffs-device


    【解决方案1】:

    这被称为 duff 设备,用于代码优化技术以减少分支指令。它起作用的原因是默认情况下没有中断的case语句会进入下一个case,所以当你遇到case 3时,你会继续进入case 2和case 1。

    【讨论】:

    • 谢谢我不知道 duff 的设备 :)
    【解决方案2】:

    docase “语句”本质上只是“转到标签”。他们不添加任何实际代码。他们只是告诉whileswitch(分别)跳转到哪里。换句话说,do 没有代码可以(不)执行。

    (也就是说,C 的语法允许cases 存在于switch 的子代中,而不是作为switch 的直接子代存在,这有点显着/奇怪。)

    【讨论】:

    • 因为它们是 goto 标签,所以没什么特别的..
    • @R.. 您使用 C 和 C++ 以外的任何语言吗?在任何语言中,switch-case 或循环开始的等价物变成 goto 标签的等价物,但其他具有结构化控制流的语言通常不允许循环和开关以这种方式交错。同样,if 语句的“else”分支的开头本质上是一个 goto 标签,但 C 不允许您有一个从“if”部分开始并在“else”部分结束的循环。
    • 我并不是说在某些抽象层面上它们就像 goto;当然,任何语言的任何控制结构都是如此。我专门谈到了 C 以及在语言本身中它们被视为与 goto 标签相同的事实。
    【解决方案3】:

    案例之间没有break 语句,因此案例失败。因此 n=3 导致 case 3: case 2:case 1: 被执行。

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2019-12-17
      • 1970-01-01
      • 2022-01-03
      • 2015-12-23
      • 1970-01-01
      • 2020-12-01
      • 2015-11-05
      • 2014-06-17
      相关资源
      最近更新 更多