0

有人可以解释将case语句嵌套到另一个中吗?我指的是 Duffs 设备,其中所有其他case语句都在do-whilecase 0. 我无法理解它。在我看来,它应该像嵌套的if. 但后来我肯定错过了一些东西。请解释。

4

2 回答 2

3

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

例如,考虑以下简单的测试程序

#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考虑语句中控制表达式的3 个值switch

5   
6
10

结果输出如下:
场景 1: i = 6

In case 6
In Default

场景二: i = 10

In case 10
In case 11
In case 12

场景 3: i = 5

In case 5

请注意,在上述每种情况下,一旦case遇到匹配的标签,语句就会顺序执行,直到break遇到 a,从而得出结论,这是答案中的第一个语句。

于 2012-02-23T15:36:51.567 回答
1

理解 Duff 设备的最简单方法是将其两个逻辑组件(theswitchdo/whileloop)彼此分开。这是一个逻辑等效的实现,其中两个语句不再嵌套:

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,只要循环本身在switch语句内开始和结束,就不需要“常规”标签和 goto。

于 2012-02-23T17:37:23.847 回答