1. ホーム
  2. coding-style

[解決済み] Switch文のフォールスルー...許されるのか?[クローズド]

2022-05-14 20:19:20

質問

物心ついたときから、私は switch 文のフォールスルーを使うのを避けていました。実際、switch ステートメントのバグ以外の何ものでもないと、早い時期に頭に叩き込まれたので、可能性のある方法として意識した覚えはありません。しかし、今日、意図的にそれを使用するコードに遭遇し、コミュニティの誰もが switch 文のフォールスルーについてどう考えているのか、すぐに気になりました。

プログラミング言語が明示的に許可すべきではないものなのか (C# は回避策を提供していますが)、それともプログラマーの手に委ねるには十分強力なあらゆる言語の機能なのでしょうか?

編集します。 フォールスルーの意味が具体的でなかったですね。私はこのタイプをよく使います。

    switch(m_loadAnimSubCt){
        case 0:
        case 1:
            // Do something
            break;
        case 2:
        case 3:
        case 4:
            // Do something
            break;
   }

しかし、こんなことが気になります。

   switch(m_loadAnimSubCt){
        case 0:
        case 1:
            // Do something, but fall through to the other cases
            // after doing it.

        case 2:
        case 3:
        case 4:
            // Do something else.
            break;
   }

この方法では、caseが0, 1のときはいつでもswitch文のすべてを実行することになります。私はこのような設計を見たことがありますが、switch文がこのように使用されることに同意できるかどうかわかりません。最初のコード例はとても便利で安全だと思います。2番目はちょっと危険な気がします。

どのように解決するのですか?

何をもってフォールスルーとするかによるかもしれませんね。 私はこのようなことでもOKです。

switch (value)
{
  case 0:
    result = ZERO_DIGIT;
    break;

  case 1:
  case 3:
  case 5:
  case 7:
  case 9:
     result = ODD_DIGIT;
     break;

  case 2:
  case 4:
  case 6:
  case 8:
     result = EVEN_DIGIT;
     break;
}

しかし、ケースラベルの後に別のケースラベルにフォールスルーするコードがある場合、私はかなり常にそれを悪だと考えています。 おそらく、共通のコードを関数に移動し、両方の場所から呼び出す方が良いアイデアでしょう。

そして、私が C++ FAQ の定義を使用しています。 "悪"