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
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;
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;
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.
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
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
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
10121600cookie-checkswitch-case-Anweisung ohne Unterbrechungyes
“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 derswitch
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