2017-02-13 12 views
0

異なるラベルを使用して各ラベルが特定の操作を行い、いくつかの操作が共通操作を書き換えずに共通の操作を行う方法はありますか? 私が代わりにこれの意味:使用オーバーラップ操作のスイッチで複数のケース

switch(input) 
{ 
case A: 
//do nothing 
break; 
case B: 
data = 0x02; 
output = data; 
break; 
case C: 
data = 0x04; 
output = data; 
break; 
case D: 
data = 0x08; 
output = data; 
break; 
default: 
//do nothing 
break; 
} 

以下のようなものがなく、出力はB、C及びD入力に対して0x08ので立ち往生していません。入力はB、C以上である場合

switch(input) 
{ 
case A: 
//do nothing 
break; 
case B: 
data = 0x02; //specific operation for B 
case C: 
data = 0x04; //specific operation for C 
case D: 
data = 0x08; //specific operation for D 
output = data; //common operation for all B,C,D labels 
default: 
//do nothing 
break; 
} 

私が必要D出力は、続いて0x02、0x04または0x08に割り当てられます。それは可能でしょうか? ありがとう!

+0

はい、可能です - 'goto'を使用してください。それが推奨されるかどうかは別の問題かもしれません... –

+1

あなたの最初のバージョンは判読可能であり、何も間違っていません。 'switch'文を使って巧妙なやり方をしようとするとバグが発生しやすく、2行のコードを保存する価値はありません。 – acraig5075

+0

@BJMyers私はgotoを使用しないことを好むが、あなたの提案に感謝 – 1chenar

答えて

4

あり、元のコードを再配置する明らかな必要だが、それは確かに可能である:いくつかのケースが他と異なる動作をすることをより明確に示しており、

bool write_output = true; 

switch(input) 
{ 
    case B: data = 0x02; break; 
    case C: data = 0x04; break; 
    case D: data = 0x08; break; 

    case A: 
    default: 
    write_output = false; 
    break; 
} 

if(write_output) 
{ 
    output = data; 
} 
0

switch-caseは、フォールスルーのように機能します。最初のcaseが一致すると、サブシーケンスcaseのすべてのステートメントは、breakステートメントが検出されるまで実行されます。

(すべてのcase文を落下)最初data0x04に設定され、その後、break文が存在しない場合に、データがDため0x08に再割り当てされるような場合には、input == 'C'とします。

基本的に、入力の場合、BCおよびDのデータは0x08に設定されます。これは、あなたが、私はこれがあなたがあなたの元のケースごとに望むものではないことを願うdata

に異なる値を望んBC例について正しいことではないだろう。

+0

はい、私はそれをしたくありません。私はオリジナルのものと同じように動作するコードを書こうとしましたが、共通の操作を複数回書き直すことはありません – 1chenar

+0

まさに。 'switch-case'がどのように動作するのか今理解していただければと思います。 2番目のコードの再配置は機能しません。 – Rishi

1

ちょうど別の方法:

switch(input) { 
    case A: 
    //do nothing 
    break; 

    default: 
    switch (input) { 
     case B: data = 0x02; break; 
     case C: data = 0x04; break; 
     case D: data = 0x08; break; 
    } 
    output = data; 
} 
関連する問題