2010-10-22 179 views
5

我一直被教導幾乎從不在編程中使用goto語句。不過,我們必須這樣做,作爲我最近編程項目的一部分。我有一個帶有各種goto語句的if/else語句,並且goto語句無法執行。我不知道爲什麼。任何幫助,將不勝感激。goto代碼執行失敗

 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 

的比特移位和這樣的簡要說明:我們實現計算機processer,並需要看一個25位操作碼的前3位。所以(myInt >> 22)& 7分離操作碼中的3位。

關於這裏發生了什麼的任何想法?

+3

什麼讓你覺得'goto'沒有執行?另外,'printf'語句可能是誤導性的或錯誤的:如果第一個'printf'打印出來,第二個和第三個將被打印出來。用一個調試器來完成它,它會告訴你在哪裏執行。 – Thanatos 2010-10-22 20:17:05

+0

你得到的結果是什麼,你想得到什麼結果? – 2010-10-22 20:18:31

+0

嗯..你用上面的printf語句試過了,沒有看到打印件?您正在測試的代碼是否有不同的代碼?你至少應該看到貫穿。 – 2010-10-22 20:19:12

回答

18

這實際上無關與後藤。你有一個運算符優先問題。按位和(&)的優先級低於等於(==)。因此,你實際上在做if ((myInt>>22) & (7 == X))

要修復它,只需添加一些parens:if ((myInt>>22) & 7) == X)

+0

非常感謝您通過發佈示例代碼來發現那些錯誤。 +1和我的最佳答案。 – finiteloop 2010-10-22 20:26:20

+2

你的意思是**按位**和(&) – 2010-10-22 20:27:43

+0

@N 1.1 - doh,固定 – SoapBox 2010-10-22 20:30:19

2

我看到},這讓我覺得標籤和相應的printf是在一個函數之外聲明的。當然,你不能這麼做..無論如何他們必須在方法中。

(這只是一個猜測,還因爲我看到你有其他的問題,其他的答案:)狀態

+0

是的,它全部在一個更大的if語句中。感謝您的支持 – finiteloop 2010-10-22 20:26:43

2

'=='運算符在C/C++中的優先級高於'&'。

嘗試if (((myInt>>22) & 7) == X)而不是

相關問題