switch(ch){
case 'a':
//do something, condition does not match so go to default case
//don't break in here, and don't allow fall through to other cases.
case 'b':
//..
case 'c':
//..
case '_':
//...
default:
//
break;
}
在如上所述的switch语句中,我输入case'a',只有在其中出现条件时才会中断,否则我想跳转到默认情况。有没有其他方法可以做到这一点,而不是标签或者呢?
答案 0 :(得分:23)
goto
胜利
switch (ch) {
case 'a':
if (1) goto LINE96532;
break;
case 'b':
if (1) goto LINE96532;
break;
LINE96532:
default:
//
break;
}
答案 1 :(得分:7)
只需对案例重新排序,以便该案例是最后一个案例:
switch(ch){
case 'b':
//..
case 'c':
//..
case '_':
//...
case 'a':
//do something, condition does not match so go to default case
if (condition)
break;
//don't break in here, and don't allow fall through to other cases.
default:
//
break;
}
答案 2 :(得分:5)
如果病情不依赖于病例,为什么要把它放进去?
if (!condition){
// do default
}else{
switch(ch){
case 'a':
// do a
break;
...
}
}
答案 3 :(得分:5)
重构你的代码:
int test_char(char ch)
{
switch(ch) {
case 'a': if (condition) return 0; break;
case 'b': // ...
default: return -1;
}
return 1;
}
...
// defaults processing switch
switch(test_char(ch)) {
case 0: break; // condition met
case 1: // default processing
default: // case not handled by test_char
}
这还增加了灵活地测试多类默认处理的好处。假设你有一组共享一些常见逻辑的字符[c,d,e,f]。对于这些情况,只需从test_char()返回2(可能在测试了一些条件之后),并将case 2:handler添加到默认的处理开关语句中。
答案 4 :(得分:1)
我不确定这是否是最好的答案,但在这里:
如果你绝对不想使用标签,并且想要保持当前顺序的情况,那么你可以在案例'a'后继续,然后检查,看看是否(ch!='a')每个后续案例的开头,仅在条件为真时执行语句:
switch(ch){
case 'a':
// do something
case 'b':
if(ch != 'a') {
//do something
}
//repeat for each subsequent case
default:
//do something
break;
}
这可能不是解决问题的最有效方法,但它应该达到你想要的效果。
答案 5 :(得分:0)
如果您必须首先拥有switch语句,因为您要检查的条件取决于具体情况(或者必须首先评估案例才能检查条件),只需在{{1例如,如果设置了该标志,则执行默认操作。例如:
switch
答案 6 :(得分:0)
这就是我的所作所为:
char ucResult = 1;
switch(ch){
case 'a':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case 'b':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case 'c':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case '_':
if(ucResult){
// do something
if(error) ucResult = 0;
}
default:
//
break;
}
使用此结构,您可以从以前的任何情况切换到默认情况。方便打破外圈。
答案 7 :(得分:0)
我希望我的解决方案能回答你的问题。只需让案例一直贯穿(从匹配案例开始),但使用条件禁用后续案例的运行。
typedef enum boolean
{
FALSE = 0, TRUE = 1
} bool;
void pstuff(char input)
{
bool _skip = FALSE;
switch(input)
{
case 'a':
printf("Case a.");
_skip = TRUE;
case 'b':
if(!_skip)
{
printf("Case b.");
_skip = TRUE;
}
case 'c':
if(!_skip)
{
printf("Case c.");
_skip = TRUE;
}
//...
default:
printf("Done!\n"); //Always gets printed.
}
}
答案 8 :(得分:0)
好吧,该帖子确实很老,但可以回答所有人: 您可以简单地写“ goto default;”您将直接跳至默认情况,而不会遇到任何问题。
示例:
switch (value)
{
case value1:
// do something;
break;
case value2:
// do something
break;
.
.
.
.
case value20:
// do something
**goto default;**
.
.
case valueN:
// do something
break;
default:
// do something
break;
}
答案 9 :(得分:-2)
跳转到默认
- 使用默认情况下的空案例标签(名称明显)
- 使用
goto case "case-labelname"
跳转到默认值<。li>
示例强>
switch (VAR)
{
case "a":
// dO STUFF !
if(COND)
goto case "DFLT";
// dO STUFF !
break;
case "B":
// dO STUFF !
break;
case "C":
// dO STUFF !
IF(COND)
goto case "DFLT";
break;
case "DFLT":
default:
// dO DEFAULT
break;
}