cambiar statement en C / Objective C

Soy nuevo en Objective-C, pero de todo lo que sé sobre las declaraciones de cambio, el siguiente código no debería imprimir nada, porque a mi me parece que debería haber un error de comstackción. Sin embargo se imprime 2. No entiendo porque. ¿Podría alguien explicar por favor?

- (void) test { int myVar = 2; switch (myVar) { case 1: { NSLog(@"result: %d", myVar); break; case 2: { NSLog(@"result: %d", myVar); } break; } } } 

Puede pensar en el constructo de switch(value){case label:, ...} como una variable goto sentencia, donde:

1) el switch(arg) determina qué ejecución de label fluirá al siguiente.
2) El caso de la palabra clave : define la etiqueta . Ejemplo: case label:

En una statement de cambio, la palabra clave del case va seguida de una etiqueta (expresión constante seguida de un : , que se trata como la etiqueta utilizada en las declaraciones goto . El control pasa a la instrucción cuya case constant-expression coincide con el valor de arg en el modificador de statement switch(arg) .

Así que legalmente no hay nada sintácticamente incorrecto con su código. Es decir, se comstackrá y construirá, y funcionará bien. Lo único que viola la syntax en su código de ejemplo es la legibilidad, ya que el flujo de ejecución ignora el bloque {...} , que en la mayoría de los casos dirigirá el flujo de ejecución, y salta directamente a la etiqueta de destino definida por la palabra clave del case , como debería.

No es frecuente que ignorar los precedentes bien establecidos para experimentar con nuevas construcciones híbridas produzca resultados útiles. Pero cuando lo hace, los resultados pueden llegar a ser legendarios. Por ejemplo, ver el dispositivo de Duff .