2010-10-22 98 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)而不是