为什么交换声明需要休息?
给定一个简单的switch语句
switch (int)
{
case 1 :
{
printf("1n");
break;
}
case 2 :
{
printf("2n");
}
case 3 :
{
printf("3n");
}
}
案例2中没有中断陈述,意味着在案例3的代码中将继续执行。这不是偶然的; 它是这样设计的。 为什么做出这样的决定? 这提供了什么好处,而不是为块创建自动中断语义? 基本原理是什么?
许多答案似乎都把重点放在了作为要求break
声明的理由的能力上。
我相信这仅仅是一个错误,很大程度上是因为当C被设计时,关于如何使用这些构造的经验并不那么多。
Peter Van der Linden在他的书“专家C编程”中阐述了这个观点:
我们分析了Sun C编译器资源,看看使用默认值的频率。 Sun ANSI C编译器前端有244条switch语句,每条语句平均有七种情况。 在所有这些情况中仅有3%发生跌落。
换句话说,97%的正常开关行为是错误的。 它不仅仅在编译器中 - 相反,在这种分析中使用fall through的情况下,编译器中出现的情况通常比其他软件中的情况更频繁,例如编译可能有一个或两个操作数的运算符时:
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
案件审理过程被广泛认为是一个缺陷,甚至有一个特殊的评论惯例,如上所示,它告诉皮特“这实际上就是其中3%的案例中的一个,这些案例需要通过审查。”
我认为对于C#来说,在每个大小写块的结尾处需要一个明确的跳转语句是个好主意(尽管仍然允许多个case标签被堆叠 - 只要只有一个语句块)。 在C#中,您仍然可以将一个案例拖入另一个案例 - 您只需使用goto
跳转到下一个案例即可明确下降。
这太糟糕了,Java没有从C语义学中突破。
在很多方面,c只是标准装配习语的干净界面。 当编写跳转表驱动流程控制时,程序员可以选择是否跳出或跳出“控制结构”,跳出需要明确的指令。
所以,c做同样的事情......
为了实施达夫的装置,显然是:
dsend(to, from, count)
char *to, *from;
int count;
{
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *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 > 0);
}
}
链接地址: http://www.djcxy.com/p/84465.html
上一篇: Why was the switch statement designed to need a break?
下一篇: Switch/Case without a `break`, doesn't check the cases properly