为什么交换声明需要休息?

给定一个简单的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