【问题标题】:What if I don't write default in switch case?如果我不在 switch case 中写 default 怎么办?
【发布时间】:2011-12-22 16:59:05
【问题描述】:
int a = 10;
switch(a){
case 0:
    printf("case 0");
    break;
case 1:
    printf("case 1");
    break;
}

上面的代码有效吗?

如果我确定 int a 不会有任何其他值而不是 1 和 0,我可以避免 default 吗?

如果在任何情况下一个值将不同于 1 和 0 怎么办?

我知道这是一个愚蠢的问题,但我想这可能是非法或未定义的行为,所以我只是要求确认一下。

【问题讨论】:

  • 我已经尝试过,但我认为这可能是非法或未定义的行为,所以只是要求确保
  • 在这种情况下,我总是设置默认值并抛出异常。现在在 C#7 中,“case when”具有更大的灵活性,我开始涵盖所有可能的情况,并使用 default 来涵盖不可能的情况。道格拉斯·亚当斯会理解这种观点。
  • 我通常会添加 ASSERT(false);,以便在 DEBUG 构建中检测到意外值。

标签: c switch-statement


【解决方案1】:

没有default 是有效的。

然而,即使你确定你不会有任何值而不是 1 和 0,最好有一个默认情况,以捕获任何其他值(尽管理论上它是不可能,在某些情况下可能会出现,例如缓冲区溢出)并打印错误。

【讨论】:

  • 您假设与 case 语句之一不匹配是错误的 - 在这种情况下可能是正确的。您可能想要只执行某个变量的一些可能值的操作,而在其他情况下继续执行。恕我直言,这是对 switch 语句的完全合理使用。
  • @Charles:他在问题中写道:看看我是否非常确定 int a 不会有任何值而不是 1 和 0 那么在这种情况下我可以避免默认值:
  • 我没有不同意你的观点,如果遇到这种情况,我很抱歉。我只是指出,虽然一般来说,使用default 标签是一种好习惯,但省略一个标签不一定是坏习惯。
  • @CharlesBailey 如果除了记录您至少考虑过默认情况(即使其中没​​有可执行代码)之外没有其他原因,那么包含默认情况似乎非常值得。考虑到包含它的好处相对较高,而忽略它并没有真正的优势,我会说包含它是非常好的做法。
  • @weberc2 is 省略它的好处是:如果你打开一个枚举,一些编译器会在 switch case 中丢失枚举值时发出警告。这是一个非常有用的工具,可以在将值添加到枚举后查找应该添加案例的位置。
【解决方案2】:

代码有效。如果没有default: 标签并且没有case 标签与“switched”值匹配,则不会执行任何受控复合语句。执行将从 switch 语句的末尾继续。

ISO/IEC 9899:1999,第 6.8.4.2 节:

[...] 如果没有转换后的case 常量表达式匹配并且没有default 标签,则不会执行开关体的任何部分。

【讨论】:

    【解决方案3】:

    这是完全合法的代码。如果 a 既不是 0 也不是 1,则 switch 块将被完全跳过。

    【讨论】:

      【解决方案4】:

      是的,上面的代码是有效的。

      如果 switch 条件不匹配 case 的任何条件并且不存在默认值,则程序继续执行,退出 switch 而不做任何事情。

      【讨论】:

        【解决方案5】:

        正如其他人指出的那样,它是完全有效的代码。但是,从编码风格的角度来看,我更喜欢添加一个带有注释的空 default 语句,以表明我没有无意中忘记它。

        int a=10;
        switch(a)
        {
        case 0: printf("case 0");
                 break;
        case 1: printf("case 1");
                 break;
        default: // do nothing;
                 break;
        }
        

        使用/不使用default 生成的代码应该是相同的。

        【讨论】:

        • 如果你打算处理枚举中的所有情况,我建议省略默认情况,因为大多数编译器会在 switch 语句中忘记枚举情况时发出警告.
        • 如果您希望它永远不会失败,那么拥有一个断言(或类似的)会更好。这样可以捕获很多错误。
        • @rdb 大多数“编译器”?做这件事的不是 IDE 吗?
        • @Kathir 我不知道,我不使用 IDE。这些警告通常由编译器生成,但 IDE 可以将它们转发给开发人员。可以想象,一些 IDE 有自己的代码检查器,也会警告开发人员。
        • @rdb 好的。两者都是可能的。编译器在编译期间生成警告。 IDE 执行名为linting 的操作。我不知道这个 linting 过程的内部结构。但是,我不认为它编译代码
        【解决方案6】:

        和no if条件匹配不提供else一样。

        default 在 switch case 中不是强制性的。如果没有匹配案例并且没有提供默认值,则不会执行任何操作。

        【讨论】:

          【解决方案7】:

          默认不是强制性的,但拥有它总是好的。

          代码是理想的,但我们的生活不是,在那里设置保护没有任何害处。如果发生任何意外情况,它还可以帮助您调试。

          【讨论】:

            【解决方案8】:

            C语言中switch语句的语法如下:

            switch(expression) {
            
               case constant-expression  :
                  statement(s);
                  break; /* optional */
            
               case constant-expression  :
                  statement(s);
                  break; /* optional */
            
               /* you can have any number of case statements */
               default : /* Optional */
               statement(s);
            }
            

            【讨论】:

              猜你喜欢
              • 2021-07-24
              • 2021-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-09
              • 1970-01-01
              • 2011-07-12
              • 2010-10-06
              相关资源
              最近更新 更多