【问题标题】:Nested case statements嵌套案例语句
【发布时间】:2012-02-23 15:31:48
【问题描述】:

谁能解释一下case 语句嵌套到另一个语句中。我指的是Duffs Device,其中所有其他case 语句都在与case 0 关联的do-while 循环内。我无法理解它。在我看来,它应该像嵌套的if。但后来我肯定错过了一些东西。请解释一下。

【问题讨论】:

  • 不要因为无法将头绕在 Duff 的设备上而感到羞耻...
  • 我的问题是关于嵌套的case 语句,我使用 Duffs 设备作为参考,因为我最初是在研究这种行为时最终到达那里的。我已经看过上面的链接,并没有太大帮助。对不起。
  • 我不明白你的问题。 Case 语句不是块,它们不嵌套。 Duff 的设备不涉及嵌套 switch 语句。贴一个你看不懂的代码示例。
  • 就像我说的我错过了一些东西。我通读了 K&R 附录 A 部分 A9(第 2 版,第 222 页)。现在世界变得更有意义了。

标签: c switch-statement duffs-device


【解决方案1】:

switch-case 构造中,switch 主体只是一个普通或复合语句,可以包含任何其他有效的 c 语句。它还可能包含casedefault 标签。
并且控件根据控制表达式值跳转到适当的案例标签,开关主体中的语句一个接一个地执行,就像任何其他范围 { } 一样,除非遇到 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;
}

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

5   
6
10

结果输出如下:
场景一: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,从而得出结论,这是答案中的第一个语句。

【讨论】:

    【解决方案2】:

    了解 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 的代码利用了在 do/while 循环内使用 case 标签的能力,只要循环本身在 switch 语句内开始和结束,消除需要“常规”标签和 goto。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 2021-11-19
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多