有人可以解释将case
语句嵌套到另一个中吗?我指的是 Duffs 设备,其中所有其他case
语句都在do-while
与case 0
. 我无法理解它。在我看来,它应该像嵌套的if
. 但后来我肯定错过了一些东西。请解释。
问问题
3340 次
2 回答
3
在switch-case
构造中,switch
主体只是一个普通或复合语句,可以包含任何其他有效的 c 语句。它也可能包含case
或default
标签。
并且控件根据控制表达式值跳转到适当的 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 设备的最简单方法是将其两个逻辑组件(theswitch
和do/while
loop)彼此分开。这是一个逻辑等效的实现,其中两个语句不再嵌套:
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 回答