Entendiendo el comportamiento de la declaración de un caso en el interruptor [cerrado]

-3
int a=4;
int b=4;

int main()
{
    switch(a)
    {
        case 1:
            {
             case 4:
                  b=7;
             case 5:
                  b=8; //added newly to check in disassembly
            }
        break;
    }
    printf("%d",b);
    return 0;
}

En este código, el valor de "b" impreso es 8. ¿Por qué el código ejecuta la declaración del caso interno, aunque no se cumple la condición del caso externo? ¿El conmutador se comporta directamente como una etiqueta de Goto independientemente de dónde se haya colocado la etiqueta de la caja?

Update: Disassembly code
    25:         switch(a) 
    26:         { 
    27:                         case 1: 
    28:                                         { 
0x00000200 481A      LDR      r0,[pc,#104]  ; @0x0000026C
0x00000202 6800      LDR      r0,[r0,#0x00]
0x00000204 2801      CMP      r0,#0x01
0x00000206 D004      BEQ      0x00000212
0x00000208 2804      CMP      r0,#0x04
0x0000020A D003      BEQ      0x00000214
0x0000020C 2805      CMP      r0,#0x05
0x0000020E D109      BNE      0x00000224
0x00000210 E004      B        0x0000021C
    29:                                          case 4: 
0x00000212 BF00      NOP      
    30:                                                                 b=7; 
0x00000214 2007      MOVS     r0,#0x07
0x00000216 4916      LDR      r1,[pc,#88]  ; @0x00000270
0x00000218 6008      STR      r0,[r1,#0x00]
    31:                                          case 5: 
0x0000021A BF00      NOP      
    32:                                                                 b=8; 
    33:  
    34:                                         } 
0x0000021C 2008      MOVS     r0,#0x08
0x0000021E 4914      LDR      r1,[pc,#80]  ; @0x00000270
0x00000220 6008      STR      r0,[r1,#0x00]
    35:                         break; 
    36:         } 
    37:          
    

1 respuesta

4

Realmente no existe tal cosa como un case anidado dentro de un case en c, y no es una instrucción de interruptor anidada (¡no hay switch() !). Lo que estás viendo es un código mal formateado y un uso inadecuado de los bloques.

Esencialmente el código es este:

int main()
{
    switch(a)
    {
        case 1:
        case 4:
            b=7;
            break;
    }
    printf("%d",b);
    return 0;
}

El caso de 1 cae en el caso de 4, por lo que básicamente tanto 1 como 4 establecerán b igual a 7.

En C, puedes usar {} para definir un alcance. Así que if enunciados, funciones, etc. También puede usarlos en el medio del código para definir variables con ámbito solo para esa región, por ejemplo,

int main() {

    ...
    {
        int a;
        //do something with a
    }
    //a goes out of scope here.
    ...
}

De hecho, puede hacer lo mismo con las declaraciones de caso si, por ejemplo, necesita una variable local:

int main()
{
    switch(a)
    {
        case 1:
        case 4: {
            int c = 1;
            //Do something with c
            b=b+c;
            break;
        } //c goes out of scope here
    }
    printf("%d",b);
    return 0;
}

Agregar el alcance alrededor de todo el caso tal como está es como en el ejemplo anterior. Pero la forma en que se agrega a la muestra en la pregunta es simplemente oscura: tendrá el mismo efecto que en mi ejemplo anterior, pero solo he visto la apertura { it después de case ... : , no antes.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas