Pregunta ¿Por qué necesitamos declaraciones de break after case?


¿Por qué el compilador no pone declaraciones de interrupción automáticamente después de cada bloque de código en el conmutador? ¿Es por razones históricas? ¿Cuándo quieres que se ejecuten varios bloques de código?


75
2018-04-25 22:58


origen


Respuestas:


A veces es útil tener múltiples casos asociados con el mismo bloque de código, como

case 'A':
case 'B':
case 'C':
    doSomething();
    break;

case 'D':
case 'E':
    doSomethingElse();
    break;

etc. Solo un ejemplo.

En mi experiencia, por lo general, es un mal estilo "fallido" y se ejecutan múltiples bloques de código para un caso, pero puede haber usos para él en algunas situaciones.


81
2018-04-25 23:02



Históricamente, es porque el case era esencialmente definir un label, también conocido como punto objetivo de un goto llamada. La instrucción switch y sus casos asociados realmente solo representan una rama multivía con múltiples puntos de entrada potenciales en una secuencia de código.

Dicho todo esto, se ha observado una cantidad casi infinita de veces break casi siempre es el comportamiento predeterminado que preferirías tener al final de cada caso.


29
2018-04-25 23:20



Java proviene de C y esa es la sintaxis de C.

Hay momentos en los que quiere que múltiples declaraciones de casos solo tengan una ruta de ejecución. A continuación hay una muestra que le indicará cuántos días en un mes.

class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if ( ((year % 4 == 0) && !(year % 100 == 0))
                     || (year % 400 == 0) )
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = " + numDays);
    }
}

25
2018-04-25 23:05



Puedes hacer todo tipo de cosas interesantes con el fracaso del caso.

Por ejemplo, digamos que desea realizar una acción en particular para todos los casos, pero en determinado caso desea hacer esa acción más otra cosa. Usar una instrucción switch con fall-down lo haría bastante fácil.

switch (someValue)
{
    case extendedActionValue:
        // do extended action here, falls through to normal action
    case normalActionValue:
    case otherNormalActionValue:
        // do normal action here
        break;
}

Por supuesto, es fácil olvidar el break declaración al final de un caso y causar un comportamiento inesperado. Los buenos compiladores lo advertirán cuando omita la declaración de interrupción.


12
2018-04-25 23:03



Creo que es un error Como construcción de lenguaje, es tan fácil tener break como el predeterminado y en su lugar tienen una fallthrough palabra clave. La mayoría del código que he escrito y leído tiene un descanso después de cada caso.


10
2018-04-25 23:07



¿Por qué el compilador no pone declaraciones de interrupción automáticamente después de cada bloque de código en el conmutador?

Dejando de lado el bueno deseo de poder usar el bloque idéntico para varios casos (que podría ser de carcasa especial) ...

¿Es por razones históricas? ¿Cuándo quieres que se ejecuten varios bloques de código?

Es principalmente por compatibilidad con C, y es discutible un antiguo truco de los tiempos antiguos cuando goto palabras clave vagaron por la tierra. Eso hace habilitar algunas cosas increíbles, por supuesto, como Dispositivo de Duff, pero si ese es un punto a favor o en contra es ... argumentativo en el mejor de los casos.


5
2018-04-25 23:12



Por lo tanto, no tiene que repetir el código si necesita varios casos para hacer lo mismo:

case THIS:
case THAT:
{
    code;
    break;
}

O puedes hacer cosas como:

case THIS:
{
   do this;
}
case THAT:
{
   do that;
}

En forma de cascada.

Realmente propenso a errores / confusión, si me preguntas.


4
2018-04-25 23:02



Java se deriva de C, cuyo patrimonio incluye una técnica conocida como Dispositivo de Duff . Es una optimización que se basa en el hecho de que el control pasa de un caso a otro, en ausencia de un break;declaración. Para cuando C estaba estandarizado, había muchos códigos como ese "en la naturaleza", y hubiera sido contraproducente cambiar el lenguaje para romper tales construcciones.


3
2018-04-25 23:10