3

我找到了以下一段代码:

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

但是还不清楚在 eg 的情况下会发生什么val = 10

我试图在一个值不正确的短程序中测试这段代码,但什么也没发生——程序正常退出。

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

4

3 回答 3

6

它只会什么都不做,无论如何都不会进入。

建议在语句中使用一个default子句作为最后一个子句switchLint如果您忘记该default子句,类似的程序会发出警告。并且对于信息请注意,该default子句是必需的MISRA-C

编辑:

我个人更喜欢它作为最后的条款,但我认为最重要的是最后条款的存在。为什么我更喜欢它作为最后一个从句是因为最小惊讶原则:人们习惯于将它视为最后一个从句,所以我认为它可以简化程序阅读。

仅作为我提到的信息LintMISRA-C我的回答:如果存在但不作为最后一个子句并明确要求作为最后一个子句存在,PC-Lint / flexelint则不会发出警告。defaultMISRA-Cdefault

于 2013-03-17T15:29:20.163 回答
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;

于 2013-03-17T15:29:58.197 回答
1

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

于 2013-03-17T15:30:41.747 回答