2010-10-22 6 views
5

Yürütülemedi. Programlamada her zaman goto ifadelerini kullanmama neredeyse her zaman öğretildi. Ancak, en son programlama projemin bir parçası olarak bunu yapmak zorundayız. Çeşitli goto deyimleriyle if/else deyim var ve goto deyimleri yürütme başarısız oluyor. Neden olduğuna dair hiçbir fikrim yok. Herhangi bir yardım takdir edilecektir.goto satır kodu

 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 

bit kayması ve bu tür kısa bir açıklama: Bir bilgisayar processer uygulanması ve 25 bit işlem kodu ilk 3 bit bakmak gerekir edilir. Yani (myInt >> 22) & 7, opcode'daki 3 biti ayırır.

Burada neler olup bittiğine dair herhangi bir fikir var mı?

+3

deneyin? Ayrıca, 'printf' ifadeleri yanıltıcı veya yanıltıcıdır: İlk' printf 'yazdırılırsa, ikinci ve üçüncü yazdırılır. Bir hata ayıklayıcısını kullanarak, yürütmenin nereye gittiğini gösterecek. – Thanatos

+0

Elde ettiğiniz sonuç nedir ve elde etmek istediğiniz sonuç nedir? –

+0

hmm .. Yukarıdaki printf ifadenizle denediniz mi ve baskıları görmediniz mi? Test ettiğiniz kodun farklı kodları var mı? En azından düşüşü görmelisin. –

cevap

18

gibi diğer sorunlarımız var bakın çünkü o da, sadece bir tahmin Bu aslında Goto ile ilgisi yoktur. Bir operatör önceliği sorununuz var. Bitsel ve (&) eşitlikten daha düşük önceliğe sahiptir (==). Sonuç olarak, aslında if ((myInt>>22) & (7 == X)) yapıyorsunuz.

Bunu düzeltmek için, bazı parantezler ekleyin: if ((myInt>>22) & 7) == X).

+0

Örnek kod göndererek tanıttığım bu hataları geçmiş için çok teşekkürler. +1 ve benden en iyi cevap. – finiteloop

+2

Yani ** Bitwise ** VE (&) –

+0

@ N 1.1 - doh, sabit – SoapBox

2

} numaralı belgeyi görüyorum ki bu, etiketlerin ve ilgili printf'un bir işlev dışında bildirildiğini düşünmüyor. Tabi ki bunu yapamazsın .. bir yöntem içinde olmak zorundalar zaten.

(ı diğer cevaplar devlet :)

+0

Evet, her şey daha büyük bir ifadenin içinde. Onu yakaladığın için teşekkürler – finiteloop

2

'==' işleci, C/C++ içindeki '&'dan daha yüksek önceliğe sahiptir.

if (((myInt>>22) & 7) == X) Eğer `goto` yürütmüyor düşündürüyor Ne yerine