Sie das switch(value){case label:, ...}
Konstrukts als Variablegoto <label>
Aussage denken kann, wobei gilt:
1)switch(arg)
bestimmt, welche label
Ausführung zum nächsten fließen.
2) Das Schlüsselwort Fall: definiert die Etikett. Beispiel: case label:
.
In einer switch-Anweisung, das case
Schlüsselwort ist, mit einem Etikett (durch ein :
gefolgt konstanten Ausdruck) gefolgt, die wie das Etikett in goto
Anweisungen verwendet behandelt wird. Die Steuerung wird an die Anweisung übergeben, deren case constant-expression
dem Wert switch(arg)
entspricht.
So legal gibt es nichts syntaktisch falsch mit Ihrem Code. Das heißt, es kompiliert und erstellt und läuft gut. Das einzige, was die Syntax in Ihrem Beispielcode verletzt, ist Lesbarkeit darin, dass der Ausführungsfluss den Block {...}
ignoriert, der in den meisten Fällen den Ausführungsfluss steuern würde, und direkt auf die durch das Schlüsselwort case
definierte Zielmarke springt sollte.
Es ist nicht oft, dass das Ignorieren eines gut etablierten Präzedenzfalls, um mit neuen hybriden Konstrukten zu experimentieren, zu brauchbaren Ergebnissen führen wird. Aber wenn dies der Fall ist, können die Ergebnisse legendär werden. Zum Beispiel see Duff's Device.
Ein 'case:' ist kein Block oder eine eigenständige Anweisung. Es ist ein ** Etikett. ** Stellen Sie es sich als Ziel eines bedingten 'goto' vor. –
Nicht sicher warum die Downvotes. Dies ist ein sehr subtiles Detail von C, das interessant ist. Kompiliert es sich, weil es sich um gültigen Code oder um die Übereinstimmung der Syntax handelt? Gehen Sie auch nach "Duffs Gerät". – bbum
@bbum es ist gültig, genau weil 'case's etiketten sind. Auch Duffs Gerät. –