代码之家  ›  专栏  ›  技术社区  ›  CJ7

为什么需要在switch语句的最后一个标签后面加break?

  •  4
  • CJ7  · 技术社区  · 15 年前

    编译器肯定知道它是 switch

    9 回复  |  直到 15 年前
        1
  •  7
  •   Chris Fulstow    15 年前

    在你的开关的最后一个案件陈述后休息一下是好的 defensive programming . 如果,也许在将来,在下面添加另一个case语句,它将消除程序流的风险 跌破 从上面的案例来看。

        2
  •  7
  •   Dean Harding    15 年前

    switch(a)
    {
         case 1:
            // do stuff
    
         case 2:
            // do other stuff
    }
    

    如果 a 是1,然后-根据C++规则-“做什么” “做其他事情”就会发生。因此,C++程序员来到C++时不会被绊倒(并且使代码更清晰),C语言要求显式指定是否要 break 或者换个标签。

    现在,至于你为什么需要 打破 最后的 布洛克,这是一个简单的一致性问题。它还使重新分解更容易:如果你移动案例,你不会突然因为缺少一个错误而导致错误 声明。另外,当你想添加另一个标签时会发生什么。

        3
  •  3
  •   Rangoric    15 年前

    一致性。原因与在带有大括号的对象实例化语句中,在最后一个枚举定义或最后一个赋值之后可以有逗号相同。最后一个案子可能并不总是最后一个案子。

    这也使得它有更少的特殊情况。

    如果是这样的话,那么学习、写作或阅读就更容易了。尽管这增加了一致性。

        4
  •  3
  •   Brian R. Bondy    15 年前

    C# switch statements

    在C和C++中,切换语句在没有中断的情况下会通过标签。在C语言中,让用户明确地说出他们想做的事情对于避免bug是很重要的。例如,很多用户从C++中来到C语言。


    特别是你要问的最后一个案子的陈述。我能想出三个好理由。

    1. 在任何语言中保持一致是很重要的。
    2. 如果稍后在它后面附加另一个case,那么应该如何处理default?
        5
  •  3
  •   scott77777    15 年前

    根据 http://msdn.microsoft.com/en-us/library/06tc147t.aspx

    通过以下任何一种方法都可以避免失败:中断、转到或返回。

        6
  •  2
  •   Carlos Muñoz Boom    15 年前

    有一种情况下,你不必把打破

    考虑以下代码:

    using System;
    
    public class Program
    {
        public static void DoStuff()
        {
        }
    
        public static void DoAnotherStuff()
        {
        }
    
        public static void Main()
        {
            switch(1)
            {
                case 1: DoStuff(); break;
                default: DoAnotherStuff();
            }
        }
    }
    

    似乎由于switch有一个常量表达式,编译器已经知道它要执行的路径,然后忽略dafault标签。

    最酷的是,如果将switch(1)更改为switch(2),它将不再编译,因为默认标签缺少中断。

    编辑: C# Reference

    C#中的要求是每个开关段的末端(包括最后一个)都是不可到达的。虽然使用跳转语句通常可以满足这一要求,但以下情况也是有效的,因为无法到达语句列表的末尾。

    case 4:
        while (true)
            Console.WriteLine("Endless looping. . . .");
    

    这就解释了为什么违约不需要中断。事实上,任何不可更改的标签都不需要中断、返回或转到

        7
  •  1
  •   jrista    15 年前

    当使用 switch break 不是唯一的选择。您还可以选择转到另一个案例、转到默认案例、转到另一个标签或返回。也可能有多个案例有一个单一的实施主体。由于最多有五个选项,再加上一个实现有多个案例的能力,编译器不能简单地给出“正确”的答案。

    你必须选择你想做的事。它可以确保编译器做正确的事情,使代码更清晰,并且使愚蠢的程序员更难做一些事情,比如在“最后一个”之后添加另一个case,并且忘记输入break/goto/return。

        8
  •  0
  •   Julien Poulin    15 年前

    根据 this blog post

    包括最后一个,有一个 无法到达的终点。目的 一般来说,我们需要你 能够任意重新排序 您的交换机没有 不小心引起了一场破坏

        9
  •  0
  •   Nick Sarabyn BClaydon    12 年前

    如前所述,可以使用default:,但也可以考虑case null。case null:不需要中断;

    大小写为空: 中断;

    如果你想“瀑布”下来,你可以这样做;

    switch (deliverMail)
    {
        case null:
        case "":
        case "Address0":
            deliverMail0();
            goto case "1";
        case "1":
            deliverMail1();
            break;
    }
    

    您可以根据需要将其与中断一起使用,但在最后一次评估中需要中断一次。