switch-case-Anweisung ohne Unterbrechung

Lesezeit: 6 Minuten

Benutzer-Avatar
Verloren1

Nach diesem Buch lese ich:

F Was passiert, wenn ich einen Umbruch in einer switch-case-Anweisung weglasse?

A Die break-Anweisung ermöglicht der Programmausführung, das switch-Konstrukt zu verlassen. Ohne sie fährt die Ausführung mit der Auswertung der folgenden case-Anweisungen fort.

Angenommen, ich habe Codes, die aussehen

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    default:
    do C;
    break;
}

Bedeutet dies, wenn ich Fall 1 wähle, sind A und C erledigt. Wenn ich Fall 2 wähle, sind B und C fertig. Wenn ich keines von beiden auswähle, ist nur C fertig.

Wenn ja, was passiert, wenn wir die Pause nach do C weglassen?

Ich nehme an, dass dies schlechte Programmierpraxis ist, aber ich bin neugierig, was passieren würde, um ein tieferes Verständnis dafür zu bekommen, wie das alles funktioniert. Vielen Dank

  • “Wenn ich Fall 1 wähle, sind A und C fertig”: Kein A, B und C ist fertig.

    – 101010

    19. Oktober 2015 um 19:36 Uhr

  • Kompilieren Sie einfach einen Testcode, der dies tut, und Sie werden es herausfinden, denke ich: p

    Benutzer5166622

    19. Oktober 2015 um 19:36 Uhr

  • Du führst aus alles beginnend mit dem ausgewählten Fall bis Sie a sehen break oder der switch Aussage endet. Es kann also sein, dass nur C ausgeführt wird, oder B und dann C, oder A und B und C, aber niemals A und C.

    – Jon

    19. Oktober 2015 um 19:36 Uhr

  • Übrigens ist das keine schlechte Programmierpraxis.

    – 101010

    19. Oktober 2015 um 19:37 Uhr

  • Obligatorischer Hinweis auf Duff’s Device 🙂

    – maddouri

    19. Oktober 2015 um 19:38 Uhr

Sie führen alles aus, beginnend mit dem ausgewählten Fall, bis Sie a sehen break oder der switch Aussage endet. Es kann also sein, dass nur C ausgeführt wird, oder B und dann C, oder A und B und C, aber niemals A und C

  • warum ist das verhalten aber so? warum ignoriert es einfach weitere Bedingungen, wenn es einmal zu Fall kommt?

    – Abhishek Choudhary

    21. April um 7:41 Uhr

Benutzer-Avatar
Khatri

  • Wenn Sie in keinem der Fälle break einschließen, werden alle folgenden Fälle ausgeführt, bis ein break angezeigt wird.

  • Und wenn Sie Pause nicht in den Standard einbeziehen, hat dies keine Auswirkungen, da es keinen Fall unterhalb dieses “Standard” -Falls gibt.

  • Und Pausen nicht zu verwenden, wird allgemein als schlechte Praxis angesehen, aber manchmal kann es auch wegen seiner durchfallenden Natur nützlich sein. Zum Beispiel:

    Fall Option A:

    //optionA needs to do its own thing, and also B's thing.
    //Fall-through to optionB afterwards.
    //Its behaviour is a superset of B's.
    

    Fall Option B:

    // optionB needs to do its own thing
    // Its behaviour is a subset of A's.
    break;
    

    FalloptionC:

    // optionC is quite independent so it does its own thing.
    break;
    

Benutzer-Avatar
Adham Gamal

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    case 2:
    do C;
    break;  
    default:
    do C;
}

wenn Ihre Option ist 1 es führt alles aus, bis es das findet break Schlüsselwort … das heißt Pause Ende der Ausführung der switch –> case
Ausgabe: A, dann B, dann C, daher wird empfohlen, nach jedem Fall eine Pause zu setzen, wie:

switch (option}{
        case 1:
        do A;
        break;
        case 2:
        do B;
        break;
        do C;
        break;        
        default:
        do D;
    }

wenn Ihre Option ist 1 die Ausgabe wird sein: nur A …

Hinweis: default braucht kein break;

Benutzer-Avatar
Craig Mosey

Das break verhält sich wie ein goto Befehl. Oder, als besseres Beispiel, ist es wie beim Verwenden return in einem void Funktion. Da es am Ende steht, macht es keinen Unterschied, ob es da ist oder nicht. Allerdings füge ich es gerne hinzu.

Benutzer-Avatar
fpierrat

Ich habe in vielen Kommentaren und Antworten gesehen, dass es eine schlechte Praxis ist, es wegzulassen break Linien. Ich persönlich finde es in einigen Fällen sehr nützlich.

Nehmen wir nur ein ganz einfaches Beispiel. Es ist wahrscheinlich nicht das beste, nimm es einfach als Illustration:
– Bei fehlerhafter Anmeldung müssen Sie den fehlgeschlagenen Versuch protokollieren.
– für den dritten Fehlversuch möchten Sie sich anmelden und weitere Dinge tun (Administrator benachrichtigen, Konto sperren, …).

Da die Aktion beim ersten und zweiten Versuch gleich ist, ist dies nicht erforderlich break zwischen diesen beiden und schreiben Sie dieselben Befehle ein zweites Mal neu.
Jetzt beim dritten Mal willst du andere Sachen machen UND auch loggen. Erst die anderen Sachen machen, dann laufen lassen (Nr break) durch die Protokollaktion des ersten und zweiten Versuchs:

switch (badCount) {
    case 3: //only for 3
        alertAdmin();
        blockAccount();
    case 2: //for 2 AND 3
    case 1: //for 1 AND 2 and 3
        errorLog();
        badCount++;
}

Imho, wenn es soooo schlechte Praxis wäre, gemeinsamen Code für verschiedene Fälle zu haben, würde die C-Struktur es einfach NICHT zulassen.

  • Sie sollten dabei if-Anweisungen verwenden, nicht a switch. Ein Schalter soll nicht zusammenhängende Fälle des Werts eines Ausdrucks stapeln, niemand, der Ihren Code liest, wird feststellen, dass die vertikale Richtung des Codes seiner logischen Richtung entspricht.

    Benutzer4396006

    29. März 2020 um 12:03 Uhr

  • Dann meinen Sie, niemand ist in der Lage, grundlegende Beispiele in Microsoft Online-Dokumenten zu lesen und zu verstehen? docs.microsoft.com/en/cpp/c-language/… siehe Beispielcodeblöcke 2 und 4.

    – fpierrat

    30. März 2020 um 16:00 Uhr


Benutzer-Avatar
Soch Guru

Der Schlüssel ist, dass die Ausführungskontrolle an die Anweisung für den übereinstimmenden Fall übertragen wird. Z.B

1. switch(x) {
2.   case 1:
3.      do_step1;
4.   case 2:
5.      do_step2;
6.   default:
7.      do_default;
8.   }

Behandeln Sie die Zeilen 2, 4, 6 als “Labels” für die goto-Aufrufe. Bei x = 1 wird die Steuerung an Zeile 3 übertragen und die Ausführung der Zeilen 3, 5 und 7 erfolgt.

  • Sie sollten dabei if-Anweisungen verwenden, nicht a switch. Ein Schalter soll nicht zusammenhängende Fälle des Werts eines Ausdrucks stapeln, niemand, der Ihren Code liest, wird feststellen, dass die vertikale Richtung des Codes seiner logischen Richtung entspricht.

    Benutzer4396006

    29. März 2020 um 12:03 Uhr

  • Dann meinen Sie, niemand ist in der Lage, grundlegende Beispiele in Microsoft Online-Dokumenten zu lesen und zu verstehen? docs.microsoft.com/en/cpp/c-language/… siehe Beispielcodeblöcke 2 und 4.

    – fpierrat

    30. März 2020 um 16:00 Uhr


Benutzer-Avatar
Thiago Navarro

Probieren Sie es aus – Führen Sie den Code mit aus Idee erhältlich hier.

#include <stdio.h>

void doA(int *i){
    printf("doA i = %d\n", *i);
    *i = 3;
}

void doB(int *i){
    printf("doB i = %d\n", *i);
    *i = 4;
}

void doC(int *i){
    printf("doC i = %d\n", *i);
    *i = 5;
}

int main(void) {
    int i = 1;
    switch(i){
        case 1:
            doA(&i);
        case 2:
            doB(&i);
        default:
            doC(&i);
            break;
    }
    return 0;
}

Ausgabe:

doA i = 1
doB i = 3
doC i = 4

Notiz:

  • Es führt alle Optionen aus dem ausgewählten Fall aus, bis es a sieht break oder der switch Aussage endet. Es kann also sein, dass nur C ausgeführt wird, oder B und dann C, oder A und B und C, aber niemals A und C
  • Wenn Sie den Wert der analysierten Variablen ändern, wechseln Sie innerhalb der Handle-Funktion (z doA), beeinflusst es den Durchfluss nicht wie oben beschrieben

1012160cookie-checkswitch-case-Anweisung ohne Unterbrechung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy