有人可以解释case
语句嵌套到另一个语句中。我引用了Duffs Device,其中所有其他case
语句都位于与do-while
相关联的case 0
循环中。我无法理解它。在我看来,它应该像嵌套if
。但那时我肯定错过了一些东西。请解释一下。
答案 0 :(得分:3)
在switch-case
构造中,switch
正文只是一个普通或复合语句,可以包含任何其他有效的c语句。它还可能包含case
或default
个标签
并且控件根据控制表达式值跳转到适当的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设备的最简单方法是将其两个逻辑组件switch
和do/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}内开始和结束声明,消除了对“常规”标签和结果的需要。