P:? ¿Cuál es la diferencia entre las declaraciones de múltiples ramas en Java y las declaraciones if ordinarias? ¿A qué se debe prestar atención al usarlas? Este es un informe de laboratorio, no hables de eso.
Hoy miré un programa senior y descubrí que para analizar el tipo de mensaje del protocolo, usé la declaración else en el if... función de interrupción. Debido a que actualmente solo hay dos tipos de noticias, es posible que haya más en el futuro, lo cual es incierto.
Creo que esto es un poco inapropiado. ¿Por qué no utilizar una declaración de cambio? Supongo que es por razones de eficiencia. Después de todo, deberíamos intentar hacer que el código de manejo de interrupciones sea más simple y más eficiente en términos de tiempo.
Así que verifiqué la información relevante, que muestra que la declaración de cambio es más eficiente que otra cosa.
La diferencia entre switch e ifelse se describe en detalle a continuación.
Conversión...caso
La diferencia fundamental con if...de lo contrario es un interruptor...case generará una tabla de salto para indicar la dirección de la rama del caso real , este El número de índice de la tabla de salto es el mismo que el número de índice del conmutador.
Los valores de las variables son iguales. Por lo tanto, switch... case no necesita atravesar la rama condicional hasta que encuentre una condición como if... De lo contrario, solo necesita acceder a la entrada de la tabla correspondiente al número de índice para llegar a la rama de posicionamiento.
El propósito de la ramificación.
Específicamente, switch...case generará una tabla de omisión con una constante de caso máxima + 1, y el programa primero determinará si la variable switch es mayor que.
Caso máximo
Constante, si es mayor que el valor, salte a la rama predeterminada para su procesamiento; de lo contrario, obtenga la dirección de la entrada de la tabla de salto cuyo número de índice es el tamaño; de la variable de cambio (es decir, la dirección de la tabla de salto Dirección inicial + tamaño de entrada de la tabla * número de índice), luego el programa salta.
Se ejecuta en esta dirección y el salto de rama se completa aquí.
//
int main()
{
Sin signo int i,j;
I = 3;
Interruptor (1)
{
Caso 0:
j = 0;
Rotura ;
Caso 1:
j = 1;
Rotura;
Caso 2:
j = 2;
Romper;
Caso 3:
j = 3;
Caso 4; :
j = 4;
Pausa;
Valor predeterminado:
j = 10;
Pausa ;
}
}
Utilice el compilador gcc para generar código ensamblador (sin optimización del compilador)
. Archivo "shiyan.c"
. texto
. Gerente Global
. Escriba main, @function
Principal:
Nivel 4 (%esp), %ecx
y $1-16%, esp
pushl -4(%ecx)
pushl %ebp
Porcentaje de movimiento esp, %ebp
pushl %ecx
sub $20 , %esp
movl $3, -8 (% descuento presupuesto)
cmpl $4, -8 (%ebp)
ja .L2 p>
movl -8(%ebp),%eax
Todos $2,%eax
movl .L8(%eax),%eax
jmp *%eax
. parte. Torre de la Roda
. Alinear 4
. Alinear 4
L8:
. Largo. L3
. largo .L4
. Largo. L5
. Largo L6
. largo .L7
.
Texto
.
movl $0,-12(%ebp)
jmp .L11
. >
movl $1,-12(%ebp)
jmp .L11
movl $2,-12(%ebp)<. /p>
jmp .L11
L6:
movl $3,-12(%ebp)
jmp .L11
. L7:
movl $4,-12(%ebp)
jmp .L11
. , -12(%ebp)
L11:
$20 adicionales, %esp
popl %ecx
popl %ebp <. /p>
leal -4 (%ecx), %esp
remojado en agua para suavizarlo
. Dimensiones principales. -Maestro
. "CCG:(Ubuntu 4 . 3 . 3-5ubuntu 4)4 . 3 . 3 "
. sección .note.GNU-stack, "", @progbits
Desde esta perspectiva, cambiar es un poco como intercambiar espacio por tiempo, que de hecho es el caso.
1. Cuando hay muchas sucursales, la eficiencia de usar el conmutador es muy alta. Debido a que el cambio es un acceso aleatorio, es decir, después de determinar el valor de selección, salta directamente a esa rama específica, pero si. . De lo contrario, se recorren todos los valores posibles hasta encontrar una rama que satisfaga la condición. Desde esta perspectiva, el cambio es de hecho mucho más eficiente que cualquier otra cosa.
2. A partir del código ensamblador anterior, podemos saber que switch...case ocupa más espacio de código porque es necesario generar una tabla de salto, especialmente cuando el rango de distribución constante del caso es grande pero real. valor efectivo Cuando es menor, la utilización de espacio del conmutador será muy baja.
3. Cambiar... situación
Solo podemos manejar situaciones constantes, pero no podemos hacer nada con situaciones no constantes. Por ejemplo, si (a > 1. &a & lt
100), no puede usar switch... para manejar el caso. Por lo tanto, switch sólo puede ser más eficiente que ifelse al elegir una rama de una constante, pero ifelse se puede aplicar a más
Ifelse es más flexible en muchas situaciones.
Desde esta perspectiva, es más apropiado utilizar switch en los manejadores de interrupciones de los senior anteriores, lo que no solo ahorra tiempo, sino que también facilita la expansión futura del programa. Porque el valor del tipo de mensaje está básicamente representado por una constante entera.