我找到了以下代码:
switch(val){
case 0:
// some actions
break;
case 1:
// some actions
break;
case 2:
// some actions
break;
}
但是,对于例如val = 10
我试图在一个程序中测试这段代码的值不正确,没有任何反应 - 程序正常退出。
此代码是否会导致任何潜在错误?有没有保证什么都不会发生?
答案 0 :(得分:6)
它无所事事,无论如何都不会进入。
建议在default
语句中使用switch
子句作为最后一个子句。如果忘记Lint
子句,default
等程序会发出警告。有关信息请注意,default
中需要MISRA-C
子句。
编辑:
我个人更喜欢它是最后的条款,但我认为最重要的是最终条款的存在。为什么我更喜欢它作为最后一个条款是因为最小惊讶的原则:人们习惯把它看成是最后一个条款所以我认为它简化了程序阅读。
正如我在回答中提到的Lint
和MISRA-C
所提供的信息:PC-Lint / flexelint
如果default
存在,则不会发出警告,但不会作为最终条款MISRA-C
发出警告1}}明确要求default
作为最后一个条款出现。
答案 1 :(得分: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;
}
另一个需要注意的小问题:它应该是案例0:不是案例0;
答案 2 :(得分:1)
如果您使用0, 1, 2
中的任何其他值(在此示例中),则不会发生任何事情。
val
将与案例中的所有值进行比较,如果它不等于其中一个值,它将跳转到下一个语句。