Ich möchte mehr über " wissen, warum nicht Variablen werden in einer switch-Anweisung deklariert? "
Ich habe den Beitrag gelesen, aber ich verstehe es nicht genau. Sie können die Variable nur innerhalb des Schalters deklarieren, aber eine Variable dekalieren und initialisieren oder das Objekt der Klasse deklarieren, das einen Complie-Zeitfehler ergibt.
Bitte erklären Sie mir ....
Im Wesentlichen, weil die Initialisierung der Variablen übersprungen würde, wenn das Label mit der Variableninitialisierung nicht getroffen würde. Dies wäre schlecht, da der Compiler dann Code ausgeben müsste, der die Variable genau dann zerstören würde, wenn der Initialisierungscode ausgeführt worden wäre.
Zum Beispiel:
%Vor% Wenn der Code default
erreicht hätte, wäre a
nicht initialisiert worden. Der Compiler hätte das im Voraus herausfinden müssen. Wahrscheinlich wurde dies aus Leistungsgründen abgelehnt.
Die einfache Lösung besteht darin, eine neue Ebene des Bereichs einzuführen:
%Vor% Das macht es in Ordnung, die Zerstörung von a
ist jetzt gut definiert.
Hier besteht ein Konflikt zwischen der Sprachsyntax und dem gesunden Menschenverstand. Für uns Menschen sieht es so aus, als ob dieser Code (aus 1800 INFORMATION's Antwort) funktionieren sollte:
%Vor%Schließlich definieren die geschweiften Klammern den Bereich für a ; es wird nur erstellt, wenn wir case 1 eingeben, es wird sofort zerstört, nachdem der case 1 -Block verlassen wurde, und es wird niemals verwendet, es sei denn, wir geben case 1 . Tatsächlich trennen die case -Etiketten und die break -Befehle die Gültigkeitsbereiche nicht, so dass a danach im gesamten Block existiert, obwohl es logisch ist unerreichbar. Und natürlich gibt es aus syntaktischer Sicht keinen case 1 -Block.
Wenn Sie die switch-Anweisung als eine Reihe von (strukturierten) goto Anweisungen in Verkleidung betrachten, wird das Problem des Bereichs deutlicher:
%Vor%