具有do-while交错的C switch语句

时间:2012-03-07 03:04:10

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

  

可能重复:
  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
案例1

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

案件之间没有break陈述,因此案件落空。因此,n = 3会导致执行case 3: case 2:case 1:

答案 2 :(得分:0)

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

(也就是说,C语法允许casesswitch的孩子中存在,而不仅仅是switch的直接孩子,这有点显着/奇怪。)