Переход от одного случая к случаю по умолчанию в операторе switch

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, подобном приведенному выше, я ввожу регистр 'a', я нарушаю его только в том случае, если внутри него возникает условие, иначе я хочу перейти к регистру по умолчанию. Есть ли другой способ сделать это, кроме ярлыков или gotos?

9 ответов

goto Для победы

switch (ch) {
    case 'a':
        if (1) goto LINE96532;
        break;
    case 'b':
        if (1) goto LINE96532;
        break;
LINE96532:
    default:
        //
        break;
}

Просто измените порядок дел, чтобы этот случай был последним:

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

Если условие не зависит от случаев, зачем помещать его внутрь?

if (!condition){
  // do default
}else{
  switch(ch){
    case 'a':
      // do a
      break;
    ...
  }
}

Рефакторинг вашего кода:

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], которые разделяют некоторую общую логику. Просто верните 2 из test_char() для этих случаев (возможно, после тестирования некоторых условий) и добавьте обработчик case 2: в оператор переключения обработки по умолчанию.

Я не уверен, что это лучший ответ, но здесь он идет:

Если вы абсолютно не хотите использовать метки и хотите сохранить дела в их текущем порядке, то вы можете продолжить после случая "а", а затем проверить, чтобы увидеть, если (ch!= 'A') в начале каждого В последующем случае оператор выполняется только в том случае, если условие истинно:

switch(ch){
    case 'a':
        // do something
    case 'b':
    if(ch != 'a') {
        //do something
    }
    //repeat for each subsequent case
    default:
        //do something
    break;
}

Это, вероятно, не самый эффективный способ решения вашей проблемы, но он должен выполнять то, что вы хотите.

Я надеюсь, что мое решение ответит на ваш вопрос. Просто позвольте случаям пройти весь путь (начиная с соответствующего случая), но используйте условие, чтобы отключить запуск последующих случаев.

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.

    }   
}

Если вы должны сначала получить операторы switch, потому что условие, которое вы проверяете, зависит от случая (или случай должен быть сначала оценен, прежде чем вы сможете проверить условие), просто установите флаг внутри вашего switch случаев, и если этот флаг установлен, то выполните операцию по умолчанию. Например:

int default_true = 0;
switch (case_value)
{
    case 'a': /* if the condition is true, set the default_true flag */

    case 'b': /* if the condition is true, set the default_true flag */

    //...

    default: default_flag = 1; // set the default_true flag to true
}

if (default_flag)
{
    //place your "default" code here rather than inside the switch statement
    //this prevents code reduplication
}

Вот что я сделал:

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

С помощью этой структуры вы можете переключиться на случай по умолчанию из любых предыдущих случаев. Удобно и для разрыва внешних петель.

Что ж, сообщение действительно старое, но чтобы ответить всем: вы можете просто написать '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;
        }

прыгать по умолчанию

  • использовать пустой регистр букв чуть выше значения по умолчанию (с очевидным именем)
  • использование goto case "case-labelname" прыгать, а затем упасть до дефолта..

пример

    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;
}
Другие вопросы по тегам