uso switch program example enum ejemplo code java switch-statement break

java - switch - romper e intercambiar parece ejecutar todas las declaraciones de casos



switch java ejemplo menu (4)

La razón por la cual el interruptor funciona como lo hace es que esto:

switch(p){ case (1): x--; case (2): x = 2; case (3): x = 3; default: x++; }

es realmente solo azúcar sintáctica para esto (básicamente):

if (p == 1) goto .L1; else if (p == 2) goto .L2; else if (p == 3) goto .L3; else goto .L4; .L1: x--; .L2: x = 2; .L3: x = 3; .L4: x++;

Java no tiene una declaración goto , pero C sí y de ahí viene. Entonces, si p es 2, salta a .L2 y ejecuta todas las instrucciones que siguen a esa etiqueta.

En la última versión estable de Java y Eclipse (Kempler), ingrese el siguiente código y ejecútelo, suponiendo que existan los nombres de paquete y clase:

package some_package; public class what_the_heck { public static void main(String[] args) { int p = 2; int x = 1; switch(p){ case (1): x--; case (2): x = 2; case (3): x = 3; default: x++; } System.out.println(x); } }

Esto imprime el valor 4. Originalmente, pensé que debería imprimir 2 porque pensé que incluso si no hubiera declaraciones de interrupción, cada fragmento de código todavía se mantiene en una declaración de caso. Ahora creo que el problema radica en cómo se compila. Por ejemplo, mi creencia actual es que internamente un booleano realiza un seguimiento de si un enunciado de caso era igual al valor. Si lo fue, entonces el booleano es verdadero y todas las declaraciones de casos se tratarán como verdaderas hasta que se encuentre un corte. Esto tiene sentido, pero todavía me pregunto si hay otras razones detrás de esto, o si estoy completamente equivocado en mi suposición.



Si una condición en un bloque de casos es verdadera y no hay return o break , todos los demás bloques de casos se ejecutarán independientemente de si son verdaderos o no.

Para una regla empírica siempre coloque un descanso o retorno al final de un bloque de case y tendrá 90% de razón.

switch (p) { case (1): x--; break; case (2): x = 2; break; case (3): x = 3; break; default: x++; break; }