Оператор C switch с чередованием do-while

Возможный дубликат:
Как работает устройство Даффа?

Я пытаюсь понять, как это работает. Любая помощь будет оценена.

#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, то состояние do для while никогда не выполняется. Но я запустил эту программу, и она дала мне результат, но не смог объяснить:
output:

3
n = 1 count = 3
case 3
case 2
case 1


person Pkp    schedule 07.03.2012    source источник


Ответы (3)


Это известно как устройство Даффа и используется в методах оптимизации кода для сокращения количества инструкций перехода. Причина, по которой это работает, заключается в том, что по умолчанию операторы case без разрывов переходят к следующему случаю, поэтому, когда вы нажимаете вариант 3, вы продолжаете переходить к варианту 2 и случаю 1.

person Jesus Ramos    schedule 07.03.2012
comment
Спасибо, что не знал об устройстве Даффа :) - person Pkp; 07.03.2012

И do, и case "операторы" по сути являются просто "метками перехода". Они не добавляют никакого реального кода. Они просто говорят while и switch (соответственно), куда перейти. Другими словами, для do нет кода для (не) выполнения.

(Тем не менее, несколько примечательно / странно, что грамматика C позволяет cases существовать в дочерних элементах switch, а не в качестве прямых дочерних элементов switch.)

person Laurence Gonsalves    schedule 07.03.2012
comment
Поскольку это лейблы goto, в этом нет ничего особенного .. - person R.. GitHub STOP HELPING ICE; 07.03.2012
comment
@R .. Используете ли вы какие-либо языки, кроме C и C ++? На любом языке эквивалент switch-case или начало цикла становится эквивалентом метки goto, но другие языки со структурированным потоком управления обычно не позволяют чередовать циклы и переключатели таким образом. Точно так же начало ветви else оператора if является, по сути, меткой goto, но C не позволяет создать цикл, который начинается в части if и заканчивается в части else. - person Laurence Gonsalves; 07.03.2012
comment
Я не имел в виду, что на каком-то абстрактном уровне они похожи на goto; конечно, это верно для любой управляющей конструкции на любом языке. Я говорил конкретно о C и о том факте, что в самом языке они обрабатываются так же, как метки goto. - person R.. GitHub STOP HELPING ICE; 07.03.2012

Между делами нет break утверждений, поэтому дела не проходят. Следовательно, n = 3 вызывает выполнение case 3: case 2: и case 1:.

person twain249    schedule 07.03.2012