2010-10-22 21 views
5

On m'a toujours appris à ne jamais utiliser les instructions goto en programmation. Cependant, nous sommes tenus de le faire dans le cadre de mon plus récent projet de programmation. J'ai une instruction if/else avec diverses instructions goto, et les instructions goto échouent à s'exécuter. Je ne sais pas pourquoi. Toute aide serait appréciée.Impossible d'exécuter la ligne de code

 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 

Une brève explication du décalage de bits et tel: Nous mettons en œuvre un processer informatique, et ont besoin de regarder les 3 premiers bits d'un opcode 25 bits. So (myInt >> 22) & 7 isole les 3 bits de l'opcode.

Des idées sur ce qui se passe ici?

+3

Ce que vous fait penser le 'goto' n'exécute pas? De plus, les instructions 'printf' sont trompeuses ou erronées: Si le premier' printf' s'imprime, le second et le troisième imprimeront. Parcourez-le avec un débogueur, qui vous montrera où l'exécution se passe. – Thanatos

+0

Quel résultat obtenez-vous et quel résultat voulez-vous obtenir? –

+0

hmm .. l'avez-vous essayé avec votre instruction printf ci-dessus et ne pas voir les tirages? Est-ce que le code que vous testez a un code différent? Vous devriez au moins voir tomber. –

Répondre

18

Cela n'a en fait rien à voir avec goto. Vous avez un problème de priorité d'opérateur. Bitwise et (&) ont une priorité inférieure à l'égalité (==). En conséquence, vous êtes en train de faire if ((myInt>>22) & (7 == X)).

Pour résoudre ce problème, il suffit d'ajouter quelques parenthèses: if ((myInt>>22) & 7) == X).

+0

Merci beaucoup d'avoir vu ces bogues que j'ai introduits en postant un exemple de code. +1 et mieux répondre de moi. – finiteloop

+2

vous voulez dire ** Bitwise ** ET (&) –

+0

@N 1.1 - doh, fixe – SoapBox

2

Je vois que } qui me fait penser que les étiquettes et les printf correspondants sont déclarés en dehors d'une fonction. Bien sûr, vous ne pouvez pas faire cela ... ils doivent être à l'intérieur d'une méthode de toute façon.

(il est juste une supposition, aussi parce que je vois que vous avez d'autres problèmes que l'état d'autres réponses :) de

+0

ouais, tout est dans une plus grande instruction if. merci d'avoir attrapé – finiteloop

2

L'opérateur '==' a une priorité supérieure à '&' en C/C++.

Essayez if (((myInt>>22) & 7) == X) à la place