プロが教える店舗&オフィスのセキュリティ対策術

C言語のswitch文で、条件によってcaseを増やしたいのですがなるべくスマートな方法はないでしょうか?

例 case 2,3のみを条件で増やしたい
int test ( int a, int b )
{
  switch( a )
  {
    case 0:
    処理1;
    break;

    case 1:  
    処理2;
    break;

/***** 条件次第 *****/
    case 2:
    処理3;
    break;

    case 3:
    処理4;
    break;
/*****************/
    default:
    処理5;
    break;
  }

  return 0;
}

考えているのは、
1.case内で分岐させる
case 2:
if(条件)
 処理3;
else
 処理5;
break;

case 3:
if(条件)
 処理4;
else
 処理5;
break;

2.素直にswitchごと分岐させる
if(条件)
{
 switch( a )
 {
  case 0:~
  case 1:~
  case 2:~
  case 3:~
  default:~
 }
}

else {
 switch( a )
 {
  case 0:~
  case 1:~
  default:~
 }
}

1だとswitchは1つで済みますがcase毎に同じ条件を入れるのが嫌。
2だとswitchごとにはシンプルになりますが共通部分をまとめたい欲求が出ます。
いい方法があれば教えてください。

既にあるプログラムに条件付きで追加したい項目があったのですが、
そこがswitch文でできていたので困って質問しました。

質問者からの補足コメント

  • 様々な解答ありがとうございました。
    似たようなものがあったりしてBAを選ぶのに迷ったのでしっくりきたものにしました。

      補足日時:2017/02/04 02:10

A 回答 (8件)

関数を一発噛ませる



int preFumc()
{
if(!ある条件 &&(a == 2)) return -1;
else if(! ある条件 && (a == 3)) return -1;

return a;
}

switch(preFunc())
{
case 1: 処理1; break;
case 2: 処理2; break;
case 3: 処理3; break;
case 4: 処理4; break;
case default: 処理1; break;
}

あるいは、else if でつなぐ

if (a == 1) 処理1;
else if (ある条件 && a == 2) 処理2;
else if (ある条件 && a == 3) 処理3;
else if (a == 4) 処理4;
else if (a == 5) 処理5;
else デフォルトラベルの処理;

あるいは、「なぜ、ある条件の時だけ特別扱いする必要があるのか?」と熟考して、設計を変える。
    • good
    • 0

switch+if で行くか、素直にswitchをやめて


if ・・・else if ・・・else if ・・・
を採用。
    • good
    • 0

まず最初の段階でif分岐させておいて、switch文を関数化するとわかりやすいのではないでしょうか。

    • good
    • 0

面白そうですね。


caseの値域が適当に小さい数値の範囲に収まっているならば、「ある条件」をバイアスかけてcaseに含めてしまう方法もありかなと思います。

条件Xが真のとき1、偽のとき0とすると、

#define BIAS 10;
...
switch (a + BIAS * X) {
case 0:
case 0 + BIAS:
 処理1;
 break;
case 1:
case 1 + BIAS:
 処理2;
 break;
case 2 + BIAS:
 処理3;
 break;
case 3 + BIAS:
 処理4;
 break;
default:
 処理5;
 break;
}

コードは格段読みにくくなるでしょうけど、
既存コードからちょっと増えただけに見えるような気がします。
    • good
    • 0

○ 全ての条件に値を割り当てて、その値で分岐する


(#3に近いです)
int processSelect = a;
if (条件が成立しない){
  if (a == 2 || a == 3) processSelect = -1; /* defaultに行くような値 */
}
switch( processSelect )

○ defaultの処理を外に出す。フラグで実行するかどうかを判定
int fDone =0;
switch (a) {
case 1 :
 処理1;
 fDone=1; break;
case 2 :
 if (条件) {
  処理2;
  fDone=1;break;
....
}
if (!fDone){
 処理5;
}
    • good
    • 0

あまり、きれいではないかもしれませんが、参考までに・・・・


if (条件が成立しない){
  //次のswitchでdefaultに流れるようにする
  if (a == 2 || a == 3) a = -1;
}
switch( a )
 {
  case 0:~
  case 1:~
  case 2:~
  case 3:~
  default:~
 }
    • good
    • 0

条件2条件3の場合は別の関数を作って呼べば可読性よくなりませんか


条件が増えたとき}の閉じ忘れもへるへりますね。
   case 2:
    return test_case2(a,b);

    break;

    case 3:
    return test_case3(a,b);
    break;
    • good
    • 0

どうしてそのようにしたいのかがいまいち分からないので


なんともいえません

質問者さんが提案しているものであれば2のほうがいいでしょう
case分の中にif分を入れるのは見づらくなりますしね

詳しく書けるなら、どういう風に利用したいのかや
元のソース、どのようになにを追加したいのかなどを書くと回答がしやすいと思いますよ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A