C Wechseln Sie die geschweiften Klammern nach jedem Fall

Lesezeit: 4 Minuten

Bens Benutzeravatar
Ben

In einem C switch-case Flusskontrolle, es ist erforderlich, geschweifte Klammern zu setzen {} nach einer case wenn Variablen in diesem Block definiert werden.

Ist es eine schlechte Praxis, nach jedem geschweifte Klammern zu setzen? caseunabhängig von der Variablendeklaration?

Zum Beispiel:

switch(i) {
  case 1: {
    int j = 4;
    ...code...
  } break;

  case 2: {  //No variable being declared! Brace OK?
    ...code...
  } break;
}

Es ist sicherlich nicht ungültig, in jedem Case-Block geschweifte Klammern zu verwenden, und es ist auch nicht unbedingt schlechter Stil. Wenn Sie aufgrund von Variablendeklarationen einige case-Blöcke mit geschweiften Klammern haben, kann das Hinzufügen von geschweiften Klammern zu den anderen den Codierungsstil konsistenter machen.

Abgesehen davon ist es wahrscheinlich keine gute Idee, Variablen innerhalb von case-Blöcken in reinem C zu deklarieren. Während dies von Ihrem Compiler möglicherweise zugelassen wird, gibt es wahrscheinlich eine sauberere Lösung. Sich gegenseitig ausschließende Case-Blöcke können möglicherweise mehrere gemeinsame temporäre Variablen verwenden, oder Sie stellen möglicherweise fest, dass Ihre Case-Blöcke besser als Hilfsfunktionen funktionieren würden.

  • Nur eine Anmerkung – man kann Variablen am Anfang von switch vor dem ersten Fall deklarieren (und somit diese Variablen teilen, ohne weitere geschweifte Klammern hinzuzufügen.

    – Martinkunew

    14. Januar 2016 um 16:04 Uhr

Benutzeravatar von DarkWingDuck
DarkWingDuck

Aufgrund der Art und Weise, wie Compiler den Code optimieren, können geschweifte Klammern in allen case-Anweisungen ohne Geschwindigkeitseinbußen verwendet werden. Es ist also nur der Stil und die Präferenz des Programmierers.

  • Die am meisten bevorzugte Verwendung ist nicht die Verwendung von geschweiften Klammern, obwohl die Verwendung in jedem Fall während einer aktiven Entwicklung einfacher sein kann, um hin und wieder einige Ergänzungen am Code vorzunehmen.

  • Es ist nur die Ästhetik; weil eine ‘case’-Anweisung nicht nur einen einzigen Befehl benötigt, sondern den Code durchläuft, während er als Label funktioniert. Blöcke werden also nicht benötigt und sind nicht ungültig.

  • In ‘case’s mit Variablen; Klammern werden nur für den Fall verwendet, um Kontexte für Variablen zu erstellen, und es ist sehr sinnvoll, sie zu verwenden. Einige Compiler auf verschiedenen Plattformen zeigen ein anderes Verhalten, wenn sie nicht enthalten sind.

  • Wissen Sie, ob es eine Geschwindigkeitsstrafe oder nur einen Verlust an Stilpunkten gibt?

    – Ben

    22. November 2010 um 1:56 Uhr

  • Es gibt keine Geschwindigkeitsstrafe und es wird kompiliert, als hätten Sie sie nicht. Ich bearbeite die Antwort, um dies aufzunehmen.

    – DarkWingDuck

    22. November 2010 um 9:33 Uhr

  • Danke Duck, leider ist die Lösung von @bta in meinem verwirrten Kopf etwas klarer, aber +1 für deine Hilfe.

    – Ben

    23. November 2010 um 5:26 Uhr

  • Es ist nicht wahr, dass “geschweifte Klammern nur für den Fall verwendet werden, um Kontexte für Variablen zu erstellen” – dies liegt hauptsächlich an den Einschränkungen der C99-Syntax (siehe nächste Antwort oder stackoverflow.com/a/8049940).

    – Kiler129

    17. September 2021 um 16:40 Uhr

Im Allgemeinen ist es eine schlechte Praxis, die Initialisierung einer Variablen zu überspringen, sei es mit goto oder switch. Das passiert, wenn Sie die Blöcke pro nicht haben case.

Es gibt sogar einen Fall in C99, in dem das Überspringen der Initialisierung illegal ist, nämlich Arrays mit variabler Länge. Sie müssen ähnlich wie Nicht-PODs in C++ “konstruiert” werden, ihre Initialisierung ist für den späteren Zugriff auf die Variable notwendig. Also in diesem Fall Sie muss Verwenden Sie die Blockanweisung.

  • +1 für WARUM es schlecht ist, eine Variable zu initieren switchdanke für den Gedanken.

    – Ben

    23. November 2010 um 5:19 Uhr

Ich halte es für schlechten Stil, Klammern in jedem zu verwenden case. Cases sind Labels in C, ähnlich wie goto Etiketten. Und in der aktuellen C-Sprache können Sie in jeder Variable Variablen deklarieren case (oder wo auch immer Sie möchten) ohne neue Blöcke einzuführen, obwohl einige Leute (mich eingeschlossen) diesen Stil auch für schlechten Stil halten.

Nur um einen kleinen Punkt hinzuzufügen, viele Editoren und IDEs ermöglichen es, Blöcke zu reduzieren und / oder automatisch einzurücken, und einige ermöglichen es Ihnen, zur passenden geschweiften Klammer zu springen – ich persönlich kenne keine, mit der Sie von einer Unterbrechung zur passenden springen können Fall Aussage.

Beim Debuggen oder Refactoring anderer Personen (oder sogar Ihrer eigenen nach ein paar Monaten) von Code, der komplexe Case-Anweisungen enthält, ist die Fähigkeit, sowohl Abschnitte des Codes zu komprimieren als auch zu übereinstimmenden Cases zu springen, von unschätzbarem Wert. insbesondere wenn der Code Einrückungsvariationen enthält.

Trotzdem ist es fast immer ein guter Rat, komplexe Fallbeschreibungen wie die Pest zu vermeiden.

1411420cookie-checkC Wechseln Sie die geschweiften Klammern nach jedem Fall

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

Privacy policy