c switch-statement duffs-device

Declaraciones de casos anidados



switch-statement duffs-device (2)

¿Puede alguien explicar la anidación de las declaraciones de case en otro? Me refiero al Dispositivo Duffs donde todas las demás declaraciones de case están dentro del ciclo do-while while asociado con el case 0 . No puedo entenderlo. Me parece que debería actuar como un if anidado. Pero definitivamente me falta algo. Por favor explique.


En una construcción de switch-case , el cuerpo del switch es simplemente una declaración normal o compuesta que puede contener cualquier otra declaración c válida. También puede contener etiquetas de case o default .
Y el control salta a la etiqueta de caso apropiada dependiendo del valor de expresión de control, las instrucciones en el cuerpo del interruptor se ejecutan una tras otra al igual que cualquier otro ámbito { } menos que se encuentre un corte.

Por ejemplo, considere el siguiente programa de prueba simple :

#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; }

Considere 3 valores para la expresión de control i en la declaración de switch :

5 6 10

Las salidas resultantes son las siguientes:
Escenario 1: i = 6

In case 6 In Default

Escenario 2: i = 10

In case 10 In case 11 In case 12

Escenario 3: i = 5

In case 5

Observe que, en cada uno de los escenarios anteriores, una vez que se encuentra una etiqueta de case coincidente, las instrucciones se ejecutan secuencialmente hasta que se encuentra un corte, lo que lleva a la conclusión que es la primera declaración en la respuesta.


La forma más fácil de entender el dispositivo de Duff es separar sus dos componentes lógicos, el switch y el ciclo do/while while, entre sí. Aquí hay una implementación lógicamente equivalente, donde las dos declaraciones ya no están anidadas:

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); }

Tenga en cuenta las etiquetas dentro del ciclo: son etiquetas C normales, no etiquetas de case .

La única diferencia entre este código y el dispositivo de Duff es que el código de Duff aprovecha la capacidad de usar etiquetas de case dentro de un ciclo do/while while, siempre que el ciclo comience y termine dentro de la instrucción switch , eliminando la necesidad de etiquetas "regulares" y ve a S.