在switch语句中从一个case跳转到默认大小写

时间:2011-09-20 11:52:55

标签: c switch-statement break

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',只有在其中出现条件时才会中断,否则我想跳转到默认情况。有没有其他方法可以做到这一点,而不是标签或者呢?

10 个答案:

答案 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;
}