嵌套的案例陈述

时间:2012-02-23 15:31:49

标签: c switch-statement duffs-device

有人可以解释case语句嵌套到另一个语句中。我引用了Duffs Device,其中所有其他case语句都位于与do-while相关联的case 0循环中。我无法理解它。在我看来,它应该像嵌套if。但那时我肯定错过了一些东西。请解释一下。

2 个答案:

答案 0 :(得分:3)

switch-case构造中,switch正文只是一个普通或复合语句,可以包含任何其他有效的c语句。它还可能包含casedefault个标签 并且控件根据控制表达式值跳转到适当的case标签,switch系统中的语句将像其他范围{ }一样一个接一个地执行,除非遇到break

例如,请考虑以下 simple test program

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

i语句中考虑控制表达式switch的3个值:

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 :(得分:1)

理解Duff设备的最简单方法是将其两个逻辑组件switchdo/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标签。

此代码与Duff设备之间的唯一区别是Duff的代码利用在case循环内使用do/while标签的能力,只要循环本身在{{1}内开始和结束声明,消除了对“常规”标签和结果的需要。