Observación en el comportamiento de la sentencia SWITCH.

Hola a todos aquí al estar repasando mis notas me encontré con una curiosidad (Al menos para mi lo es) respecto al funcionamiento de la sentencia SWITCH que quisiera compartir con ustedes, la verdad, no sé si ya lo habrán notado, pero al menos estoy seguro que muchos no tienen ni idea de lo confuso que pudiera ser el funcionamiento de una sentencia SWITCH (Y refiriéndome más hacia las personas que aún dan sus primeros pasos en J2SE).

Si tenemos el siguiente código:
 

El resultado es el siguiente:
2
default
3
4

Si tenemos ahora el siguiente código:
 

El resultado es el siguiente:
default
3
4

Lo ejemplos anteriores me hicieron entender lo siguiente: "En cuanto se encuentra un default, inmediatamente se ejecuta y se ejecutarán también los cases restantes en cascada(Por no tener sus respectivos breaks claro)". Pues bien, no sé si ustedes hayan pensado lo mismo, pero luego al estar haciendo pruebas me encontré con los siguientes resultados:

Si tenemos este código:
 

El resultado es el siguiente:
2
4

Y finalmente, si tenemos el siguiente código:
 

El resultado que obtendremos será:
default
2
4

Lo que me hizo notar que lo que pensé anteriormente estaba mal, y en realidad la forma en que trabaja el bloque switch, es como si al momento de entrar el ya supiera de antemano si el valor que se busca lo tiene o no lo tiene, si lo tiene, se espera a encontrarlo para ejecutarlo y si no lo tiene, sabrá que al momento de llegar al default, inmediatamente entrará para ejecutarlo.

Bueno, únicamente quería compartir esta observación con ustedes, por que yo no sé si sea muy obvio, o si muchos de ustedes ya sabían, pero como la mayoría de las veces, ponemos los cases en orden ascendente y el default de último, apuesto que muchos no habrán notado este funcionamiento. ¡¡Es algo confuso!!. Me encantaría que dejaran sus comentarios al respecto. Y espero esto les ayude a varios.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

break

Por eso debes poner un break al final de cada case. El switch va evaluando el valor que le indicaste contra cada caso y cuando encuentra uno que se cumple, lo ejecuta. El default siempre se cumple. El problema es que una vez que encuentra la condición que se cumple, simplemente sigue ejecutando todo ese código y se ignora el resto de los cases. Por lo tanto si se cumple el case 3, se ejecuta ese código y si sigue un case 1, 2, 3, 4, 5, default, lo que sea, se va a continuar ejecutando. El break sirve para salir del bloque del switch y que ya no se ejecute el código de las demás condiciones. Y como el default siempre se cumple, por eso debe ir al final, como la última condición.

Imagen de willyxoft

Referencia.

Para ejemplificar y reforzar lo que te explica ezamudio, dale un vistazo a: , pero si tienes duda, vuelve a preguntar.

Imagen de iberck

if/else

Yo prefiero utilizar sentencias if else en lugar de switch

Imagen de ezamudio

if/else

yo también prefiero puros ifs. Sale un poco más de código pero queda más claro y si se te ocurre meter una condición adicional, no importa tanto el orden donde la metas, al menos cuando estás comparando valores numéricos. Es decir

 

No importa si de repente metes algo asi:

 

y en el switch si mal no recuerdo, los valores numéricos deben ir de manera incremental porque si pones   y más abajo tienes un   ya no entra nunca ahí (o tal vez eso era en otro lenguaje).

Imagen de cfpmx

Hola ezamudio, Respecto a tu

Hola ezamudio,

Respecto a tu comentario sobre los bloques SWITCH:

y en el switch si mal no recuerdo, los valores numéricos deben ir de manera incremental porque si pones case 100 y más abajo tienes un case 50 ya no entra nunca ahí (o tal vez eso era en otro lenguaje).

Nada mas quería aclarar que los cases no tienen que estar de manera incremental en Java, pueden ir en el orden aleatoreo, ya que los cases se van evaluado uno a uno de arriba hacia abajo. Y mira, en el tercer ejemplo que planteo en esta entrada, se refleja esto, simplemente que al no tener el break pues se pasa de largo con los cases restantes, pero en fin, esto de los break es intencional, para comprender como funciona mas a fondo las sentencias SWITCH.

Por cierto, en tu primer comentario también dijiste que el default siembre se cumple, y no es así. Casualmente, puedes comprobar esto otra vez con el tercer ejemplo que plantié.

¡Saludos a todos!

Imagen de bonfil1

Hola

Pues a mi paracer esta algo confuso si no se usa el orden ascdente pero a un asi esta bien este post, lo que a mi parecer demuestra es que como la variable se inicializa con un valor pero no encuentra una condicion para ese valor o viceversa entons imprime los cases mas cercanos, segun vi?? o no solo me confundi mas jeje.