2017-12-31 88 views
9

Hier ist ein Beispiel für eine switch Anweisung. Ich verstehe nicht, warum es so funktioniert:Warum kann ich einen Fall in einen anderen Fall in einer switch-Anweisung einfügen?

int main(){ 

    int number1 = 100, number2 = 200; 

    switch(number1){ 
     case 100:{ 
      cout << " outer switch number is: " << number1 << endl; 
     case 200:{ // any value other than 100 
       cout << "inner switch number is: " << number2 << endl; 
      } 
      break;    
     } 
     break;  
    } 

    return 0; 
} 
  • Das obige Programm druckt: 100 und druckt dann die nächste Anweisung von case 200. Wenn im zweiten Fall ein anderer Wert als 200 verwendet wird, wird er weiterhin ausgeführt. Ich weiß, dass es keine break nach case 100 gibt. Aber warum bekomme ich stattdessen einen Kompilierungsfehler?

  • Um klarer zu sein, warum wird auch ein anderer Wert innerhalb des inneren Falles erfolgreich sein? Z. B.

    case 70000: 
    
+1

Ein Schalter/Gehäuse ist so ziemlich ein berechneter Wert goto/label, mit einigen zusätzlichen Einschränkungen. – Eljay

+2

gibt es keine 'break'-Anweisung zwischen' case 100' und 'case 200', daher passiert der Fall durch. –

+2

['switch' hat viel unangenehmere Dinge, als irgendjemand jemals denken würde] (http://blog.robertelder.org/switch-statements-statement-expressions/). –

Antwort

9

Aber warum ich nicht bekommen einen Fehler bei der Kompilierung statt?

Weil Sie nichts Illegales getan haben. Eine Case-Anweisung ist nur eine beschriftete Anweisung. Der Ausdruck im Schalter wird ausgewertet, um zu bestimmen, zu welcher Sprungmarke (siehe "Sprung" und "Markierung") und dann diese Anweisung beginnt. Es ist nur ein getado in der Verkleidung, um ehrlich zu sein. Es ist ein bisschen eingeschränkter, aber immer noch ein Sprung.

Die einzige Einschränkung, da dies C++ ist, ist, dass Sie die Initialisierung eines Objekts nicht überspringen können, indem Sie vorspringen.

Diese Funktion wurde bekanntermaßen in Duff's Device (wenn auch in C) verwendet.

Um klarer zu sein, warum auch ein anderer Wert innerhalb des inneren Falles auch erfolgreich sein wird?

Da nach dem Sprung durchgeführt wird, sind diese Beschriftungen nicht wichtig. Sie markieren nur bestimmte Aussagen. Nach dem Sprung wird die Ausführung normal fortgesetzt. Und die normale Ausführung vermeidet keine spezifischen Anweisungen, nur weil sie beschriftet sind.

+0

Danke. Aber wenn "Case 0" oder "Case 100000" geschrieben wird, funktioniert es für jeden Wert ??! – Alex24

+2

@ Alex24 - Nein, tut es nicht. Für '100' wird die Ausführung des äußeren Blocks gestartet. Für '200' wird der erste Befehl im äußeren Block übersprungen und in den inneren Block gesprungen. Wenn Sie '200' in' 10000' ändern, wird immer noch der äußere Block ausgeführt, weil 'number1'' 100' ist. – StoryTeller

+0

Ich meine, wenn das Äußere erfolgreich ist, was auch immer der innere bewertete Wert wird erfolgreich sein? !!! – Alex24

1

Warum wird kein Kompilierungsfehler angezeigt? Das liegt daran, dass Sie den Ausdruck switch korrekt verwendet haben. Aber möglicherweise sehen Sie die Ergebnisse nicht wie gewünscht. Lassen Sie sich zunächst versuchen, einen einfachen switch Ausdruck:

switch(number1){ 
    case 100: 
     cout<<"the number is 100"<<endl; 
     break; 
    case 200: 
     cout<<"the number is 200"<<endl; 
     break; 
    default: 
     cout<<"the number is neither 100 nor 200"<<endl; 
     break; 
} 

Wenn Sie andere Zahlen verwenden möchten, können Sie zum switch-case Block hinzufügen. Wenn Sie keine Pause verwenden, bedeutet dies, dass der nächste Fall das Ziel ist. Bis Sie die Pause nicht nutzen, wird das Programm fortgesetzt. Die default sagt, wenn nicht der oben genannten passiert, möchte ich diesen Teil tun.

Lassen Sie sich zu Ihrem Programm gehen und was los ist:

switch(number1){ 
    case 100:{//if the number is 100 it will start from here 
     cout << " outer switch number is: " << number1 << endl; 
     //it will break after the first break expresion 
    case 200:{ // any value other than 100// if the number is 200 it will start from here 
      cout << "inner switch number is: " << number2 << endl; 
     } 
     break; // I meant her is the first break  
    } 
    break;  
} 
0

A switch Anweisung funktioniert wie if Aussage, aber es ist es bevorzugt, wenn sie mit mehr als 2 oder 3 Wahlen zu tun.

switch bewertet Bedingungen in case Aussagen.Wann immer es einen Fall findet, betrachtet es es als Bedingung, so dass es weiter ausgeführt wird, bis eine Pause als ein Zeichen für das Ende der Aussage gefunden wird. In Ihrem Fall case 100 beginnt, aber ein anderer Fall ist im Inneren, so lange es keine Pause für 100 Jahre gibt, alles, nachdem es ausgeführt wird.

case 100: 
    // do some stuff 
    case 0: 
     // do another stuff 
    case 5779: 
     // do .... 
break; 

Al das oben Gesagte wird, wenn nur ausgeführt werden, und wenn case 100 erfolgreich ist.

in C++ Denken Sie daran, Sie schreiben:

void foo(){ 
    cout << "foo" << endl: 
} 

int main(){ 

    b: 
     foo();   

    return 0; 
} 

Es case wie das label aber nur mit dem Schlüsselwort. Sie können ein case innerhalb des Falles ohne sein switch sagen oder vorangestellt von break funktioniert die gleiche Weise, die ein label funktioniert.

Verwandte Themen