Вложенные описания дел - PullRequest
       25

Вложенные описания дел

0 голосов
/ 23 февраля 2012

Может кто-нибудь объяснить, пожалуйста, вложенность операторов case в другой. Я имею в виду устройство Duffs , где все остальные операторы case находятся внутри цикла do-while, связанного с case 0. Я не могу разобраться с этим. Мне кажется, что он должен действовать как вложенный if. Но тогда я определенно что-то упускаю. Пожалуйста, объясните.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

В конструкции switch-case тело switch является просто нормальным или составным оператором, который может содержать любые другие допустимые операторы c. Он также может содержать case или default метки.
И элемент управления переходит к соответствующей метке регистра в зависимости от значения выражения, операторы в теле переключателя выполняются одна за другой, как и любая другая область действия { }, если не встречается break.

Например, рассмотрим следующую простую тестовую программу :

#include<stdio.h>
int main()
{
    int i = 6;//5,10;
    switch(6)
    {
        case 10:
              printf("\nIn case 10");
        case 11:
              printf("\nIn case 11");              
        case 12:
              printf("\nIn case 12");
              break;
        case 5:
              printf("\nIn case 5");
              break;
        case 6:
              printf("\nIn case 6");     
        default:
              printf("\nIn Default");

    }

    return 0;
}

Рассмотрим 3 значения для управляющего выражения i в операторе switch:

5   
6
10

Результирующие выходы следующие:
Сценарий 1: i = 6

In case 6
In Default

Сценарий 2: i = 10

In case 10
In case 11
In case 12

Сценарий 3: i = 5

In case 5

Обратите внимание, что в каждом из приведенных выше сценариев, когда встречается соответствующая метка case, операторы выполняются последовательно до тех пор, пока не встретится break, тем самым приводя к заключению, которое является первым утверждением в ответе.

1 голос
/ 23 февраля 2012

Самый простой способ понять устройство Даффа - это отделить два его логических компонента, цикл switch и do/while, друг от друга.Вот логически эквивалентная реализация, в которой два оператора больше не являются вложенными:

void copy(int* to, int* from, int count) {
    int n = (count + 7) / 8;
    switch(count % 8) {
        case 0: goto case_0;
        case 1: goto case_1;
        case 2: goto case_2;
        case 3: goto case_3;
        case 4: goto case_4;
        case 5: goto case_5;
        case 6: goto case_6;
        case 7: goto case_7;
    }
    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);
}

Обратите внимание на метки внутри цикла: это обычные метки C, а не case метки.

Единственное различие между этим кодом и устройством Даффа состоит в том, что код Даффа использует возможность использования меток case внутри цикла do/while, пока сам цикл начинается и заканчивается внутри оператора switch, устраняя необходимость в "обычные "ярлыки и gotos.

...