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 desea omitir todos los casos siguientes, debe poner un break;
al final de este bloque de casos o todos los siguientes bloques de casos se ejecutan, también.
Eche un vistazo: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
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;
}
Cuando no pones un break
el interruptor ejecutará todos los demás casos que están debajo del punto de entrada
Entonces realmente se ejecuta
x = 2;
x = 3;
x++;
print(x);
System.out.println(x);
Tks to Pshemo aquí es un enlace a la especificación de la declaración de cambio