2010-10-22 22 views
5

Siempre me han enseñado a casi nunca utilizar declaraciones goto en la programación. Sin embargo, estamos obligados a hacerlo como parte de mi proyecto de programación más reciente. Tengo una instrucción if/else con varias declaraciones goto, y las declaraciones goto no se pueden ejecutar. No tengo ni idea de porqué. Cualquier ayuda sería apreciada.goto línea de código que no se puede ejecutar

 int myInt = XXXXXXX; 
     if((myInt>>22) & 7 == X) 
      goto a; 
     else if((myInt>>22) & 7 == Y) 
      goto b; 
     else if((myInt>>22) & 7 == Z) 
      goto c; 
a: 
    printf("this always executes\n"); 
    goto end; 
b: 
    printf("this never executes\n"); 
    goto end; 
c: 
    printf("nor does this\n"); 
    goto end; 
end: 
    //more code 

Una breve explicación del desplazamiento de bits y dicho: Estamos implementando una procesadora de ordenador, y la necesidad de mirar a los 3 primeros bits de un código de operación de 25 bits. Entonces (myInt >> 22) & 7 aísla los 3 bits en el código de operación.

¿Alguna idea de lo que está pasando aquí?

+3

¿Qué te hace pensar que el 'goto' no se ejecuta? Además, las instrucciones 'printf' son engañosas o incorrectas: si imprime la primera' printf', se imprimirá la segunda y la tercera. Dé un paso adelante con un depurador, que le mostrará dónde va la ejecución. – Thanatos

+0

¿Cuál es el resultado que está obteniendo y cuál es el resultado que quería obtener? –

+0

hmm ... ¿lo intentó con su declaración de printf anterior y no ve las impresiones? ¿El código con el que está probando tiene un código diferente? Al menos deberías ver Fallthrough. –

Respuesta

18

En realidad, esto no tiene nada que ver con Goto. Tienes un problema de precedencia del operador. Bitwise y (&) tienen precedencia menor que igualdad (==). Como resultado, en realidad está haciendo if ((myInt>>22) & (7 == X)).

Para solucionarlo, simplemente agregue algunos parens: if ((myInt>>22) & 7) == X).

+0

Muchas gracias por ver más allá de esos errores que introduje publicando código de muestra. +1 y la mejor respuesta de mí. – finiteloop

+2

te refieres a ** Bitwise ** AND (&) –

+0

@N 1.1 - doh, fijo – SoapBox

2

Veo que } me hace pensar que las etiquetas y printf correspondientes están declarados fuera de una función. Por supuesto que no puedes hacer eso ... tienen que estar dentro de un método de todos modos.

(es sólo una suposición, también porque veo que tienes otros problemas como el estado otras respuestas :)

+0

sí, todo está dentro de una declaración if más grande. gracias por atraparlo – finiteloop

2

El operador '==' tiene una precedencia mayor que '&' en C/C++.

Trate if (((myInt>>22) & 7) == X) lugar

Cuestiones relacionadas