web-dev-qa-db-ja.com

switchステートメントの1つのケースからデフォルトのケースへのジャンプ

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'を入力し、その内部の条件が発生した場合にのみブレークします。それ以外の場合は、デフォルトのケースにジャンプします。ラベルや後藤以外に、これを行う他の方法はありますか?

20
thetux4

goto勝利のために

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

ケースを並べ替えて、そのケースが最後になるようにします。

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

状態がケースに依存しない場合、なぜそれを中に入れるのですか?

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

コードをリファクタリングします。

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を返し、ケース2:ハンドラーをデフォルトの処理スイッチステートメントに追加します。

5
Kaos

これが最良の答えかどうかはわかりませんが、次のようになります。

ラベルを絶対に使用せず、ケースを現在の順序で保持したい場合は、ケース「a」の後に続けて、各冒頭のif(ch!= 'a')を確認してください。その後のケースでは、条件が真の場合にのみステートメントを実行します。

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

これはおそらく問題を解決するための最も効率的な方法ではありませんが、あなたが望むことを達成するはずです。

1
Andrew

私の解決策があなたの質問に答えてくれることを願っています。単純にケースを(一致するケースから始めて)ずっと通過させますが、条件を使用して後続のケースの実行を無効にします。

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.

    }   
}
0
Minh Tran

まあ、投稿は本当に古いですが、誰にでも答えるには、「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;
        }
0
user11852835

チェックする条件がケースに依存するため(または条件をチェックする前にケースを最初に評価する必要があるため)、最初に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
}
0
Jason

これが私がしたことです:

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

この構造では、以前のケースからデフォルトのケースに切り替えることができます。外側のループを壊すのにも便利です。

0
Taha Paksu