2014-11-11 2 views
13

Ich bin neu in Objetive C, aber nach allem, was ich über Switch-Anweisungen weiß, sollte der folgende Code nichts drucken, denn für mich scheint es, dass es einen Kompilierungsfehler geben sollte. Es wird jedoch 2 IS gedruckt. Ich verstehe nicht warum. Könnte jemand bitte erklären?Switch-Anweisung in C/Objective C

- (void) test { 
    int myVar = 2; 

    switch (myVar) { 
     case 1: 
     { 
      NSLog(@"result: %d", myVar); 
      break; 

      case 2: 
      { 
       NSLog(@"result: %d", myVar); 
      } 
      break; 
     } 
    } 
} 
+9

Ein 'case:' ist kein Block oder eine eigenständige Anweisung. Es ist ein ** Etikett. ** Stellen Sie es sich als Ziel eines bedingten 'goto' vor. –

+5

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

+1

@bbum es ist gültig, genau weil 'case's etiketten sind. Auch Duffs Gerät. –

Antwort

13

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.