web-dev-qa-db-ja.com

switchステートメントのケースをグループ化しますか?

私は何かを見ているかもしれませんが、C++では、ケースを個別に書き出すのではなく、グループ化する簡単な方法がありますか?私は基本的に私がちょうどできることを覚えています:

SELECT CASE Answer
CASE 1, 2, 3, 4

C++の例(必要な場合):

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1:
      case 2:
      case 3:
      case 4:
         cout << "You need more cars. ";
         break;                                        
      case 5:
      case 6:
      case 7:
      case 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}
29
Josh Lake

いいえ。ただし、if-else if-elseチェーンは同じ結果を達成します:

if (answer >= 1 && answer <= 4)
  cout << "You need more cars.";
else if (answer <= 8)
  cout << "Now you need a house.";
else
  cout << "What are you? A peace-loving hippie freak?";

また、0台の車の場合と、おそらく例外をスローすることによって負の数の車の予期しない場合を処理することもできます。

PS:変数を大文字で始めるのはスタイルが悪いと考えられているため、Answeranswerに名前を変更しました。

サイドノートとして、Pythonなどのスクリプト言語ではNice if answer in [1, 2, 3, 4]構文。これは、目的を達成するための柔軟な方法です。

12
marcog

知っている限り、C++で物事をコンパクトにするためにリターンを省略するだけです。

switch(Answer)
{
    case 1: case 2: case 3: case 4:
        cout << "You need more cars.";
        break;
    ...
}

(もちろん、他の返品も削除できます。)

29
Leo Davidson

もちろんできます。

範囲にケースx ... yを使用できます

例:

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1 ... 4:
         cout << "You need more cars. ";
         break;                                        
      case 5 ... 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}

コンパイラ内で「-std = c ++ 0x」フラグが有効になっていることを確認してください

17
Ankit Patel

キーワードcaseは削除できません。しかし、次のように例を短く書くことができます。

switch ((Answer - 1) / 4)                                      
{
   case 0:
      cout << "You need more cars.";
      break;                                        
   case 1:
      cout << "Now you need a house.";
      break;                                        
   default:
      cout << "What are you? A peace-loving hippie freak?";
}
5
Dialecticus

あなたの例はswitchコンストラクトで得られるほど簡潔です。

3
aschepler

プリプロセッサの悪用の道を進んで進んでいるのであれば、 _Boost.Preprocessor_ が役立ちます。

_    #include <boost/preprocessor/seq/for_each.hpp>

    #define CASE_case(ign, ign2, n) case n:

    #define CASES(seq) \
        BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq)

    CASES((1)(3)(15)(13))
_

プリプロセッサのみを実行するために_-E -P_でgccを介してこれを実行すると、CASESの展開は次のようになります。

_    case 1: case 3: case 15: case 13:
_

これはおそらくコードレビューに合格しないので(私が働いている場所ではないでしょう!)、個人的な使用に制限することをお勧めします。

CASE_RANGE(1,5)マクロを作成して展開することも可能です。

_    case 1: case 2: case 3: case 4: case 5:
_

あなたにも。

1
SirGuy

次のように使用できます。

case 4: case 2:
 {
   //code ...
 }

4または2スイッチケースを使用します。

1
burakim

gccには、いわゆる「ケース範囲」拡張子があります。

http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

私はgccのみを使用していたときにこれを使用していました。それについて実際に言うことはあまりありません-値の範囲についてだけですが、それはあなたが望むものを並べ替えます。

これの最大の問題は、gccのみがサポートしていることです。これは問題になる場合もあれば、そうでない場合もあります。

(あなたの例では、ifステートメントがより自然にフィットすると思います。)

1

いいえ、互換性を壊したいのでなければandがサポートします。

0
Mitro