2017-02-13 11 views
0

Gibt es in C eine Möglichkeit, verschiedene Case-Labels zu durchlaufen, bei denen jedes Label eine bestimmte Operation und einige allgemeine Operationen durchführt, ohne die übliche Operation umzuschreiben? ich statt dies bedeuten:Mehrere Fälle in Switch mit Überlappungsoperationen

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

Verwendung so etwas wie unten aber Ausgang bei 0x08 für B, C und D-Eingänge nicht fest:

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

ich brauche, wenn der Eingang B, C oder D Der Ausgang wurde anschließend 0x02, 0x04 oder 0x08 zugewiesen. Ist es möglich? Danke!

+0

Ja, es ist möglich - benutze ein 'goto'. Ob es ratsam ist oder nicht, könnte eine andere Sache sein ... –

+1

Ihre erste Version ist lesbar und verständlich, es ist nichts falsch daran. Der Versuch, clevere Tricks mit einer 'switch'-Anweisung auszuführen, ist fehleranfällig und nicht wert, ein paar Zeilen Code zu speichern. – acraig5075

+0

@BJMyers Ich bevorzuge es, nicht zu verwenden, aber danke für Ihren Vorschlag – 1chenar

Antwort

4

Es gibt keine offensichtliche Notwendigkeit, den ursprünglichen Code neu zu ordnen, aber es ist durchaus möglich:

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-Fall wirkt wie ein Durchfall. Nach der ersten case Übereinstimmung werden alle folgenden Abfragen case ausgeführt, bis eine break Anweisung auftritt.

Es sei input == 'C', in einem solchen Fall zuerst data wird 0x04 und dann in Abwesenheit von break-Anweisung gesetzt werden, werden die Daten zu 0x08 für D neu zugewiesen werden (fallen durch alle case-Anweisungen).

Grundsätzlich für Eingänge B, C und D Daten werden 0x08 eingestellt werden. Dies wird nicht richtig sein für B und C Fälle, in denen Sie einen anderen Wert wollen für data

Ich hoffe, das ist nicht das, was Sie nach Ihren ursprünglichen Fällen mögen.

+0

Ja, ich möchte das nicht tun. Ich habe versucht, einen Code zu schreiben, der wie der Original funktioniert, aber ohne den allgemeinen Vorgang mehr als einmal zu schreiben. – 1chenar

+0

Genau. Ich hoffe du verstehst jetzt wie 'switch-case' funktioniert. Die zweite Code-Neuanordnung funktioniert nicht für Sie. – Rishi

1

Nur ein weiterer Weg, die mehr zeigt deutlich, dass einige Fälle verhalten sich anders als andere:

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