如果没有默认情况,switch语句会发生什么?

3
我找到了以下代码:

我找到了以下代码:

switch(val){
    case 0:
        // some actions
       break;
    case 1:
        // some actions
       break;
    case 2:
        // some actions
       break;
}

但是如果例如val = 10的情况下会发生什么并不清楚?

我尝试在一个有错误值的短程序中测试这段代码,但没有任何反应 - 程序正常退出。

这段代码会导致潜在错误吗?有没有保证什么都不会发生?


一个开关本质上是一系列“跳转”的华丽表现,如果你这样考虑,就清楚了,你永远不会出错。 - teppic
3个回答

6
它将不执行任何操作,也不会进入任何情况。建议在 switch 语句中最后一个添加 default 子句。如果忘记添加 default 子句,像 Lint 这样的程序会发出警告。而且需要注意的是,在 MISRA-C 中要求必须有 default 子句。
编辑:我个人更喜欢它作为最后一个子句,但我认为最重要的是最后一个子句应该存在。为什么我更喜欢它作为最后一个子句呢?因为出于“最小惊讶原则”的考虑:人们习惯把它看作是最后一个子句,所以我认为它可以方便程序阅读。
仅供参考,正如我在回答中提到的 lint 和 MISRA-C:PC-Lint / flexelint 不会警告如果 default 子句存在但不是最后一个,并且 MISRA-C 明确要求 default 子句必须作为最后一个子句存在。

有时候(我会说是经常),我会把 default 作为第一个 case 标签 :) - pmg
我更倾向于不使用没有代码的 default 子句。像 Lint 这样的工具会抱怨你没有一个 default,但是如果你在枚举中进行切换并添加了一个新的可能值,但没有在 switch 语句中添加,那么有一个 default 情况会阻止 Java 编译器为您提供(更有用的)警告,即您的 switch 可能不完整(即:您未处理新的枚举值)。 - spaaarky21

1
这就是为什么你应该有一个默认情况。它将处理除你输入的情况之外的情况。
在你的情况下发生的是,它检查了情况0,但它不匹配,然后检查情况1,它也不匹配,再检查情况2,它还是不匹配。所以它退出了。
所以应该这样做:
switch(val){
    case 0:
        // some actions
       break;
    case 1:
        // some actions
       break;
    case 2:
        // some actions
       break;
    default:
       //some actions
       break;
}

另一个需要注意的小点:应该写成case 0:而不是case 0;。

我认为它的工作原理类似于跳转表,而不是if-else序列。 - Alex
是的,跳转表。如果它没有正确的值,应该有一个默认情况,这样它至少会命中其中一个。 - lakshmen

1
如果您使用此示例中的0, 1, 2之外的任何其他值,将不会发生任何事情。 val将与所有在case中的值进行比较,如果它不等于其中任何一个值,则只会跳到下一条语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接