C 按位AND的结果显示为0,但不是';T

C 按位AND的结果显示为0,但不是';T,c,bit-manipulation,C,Bit Manipulation,我有以下情况: #include <stdio.h> int main(void) { int first = 0x08; printf("%d\n", first & 0b10); printf("%d\n", first & 0b10 == 0); if (first & 0b10 == 0) { printf("SET"); } else { printf("NOT"); } return 0; }

我有以下情况:

#include <stdio.h>

int main(void) {
  int first = 0x08;

  printf("%d\n", first & 0b10);
  printf("%d\n", first & 0b10 == 0);

  if (first & 0b10 == 0) {
    printf("SET");
  } else {
    printf("NOT");
  }

  return 0;
}
#包括
内部主(空){
int first=0x08;
printf(“%d\n”,第一个&0b10);
printf(“%d\n”,第一个&0b10==0);
如果(第一个&0b10==0){
printf(“SET”);
}否则{
printf(“非”);
}
返回0;
}

打印两个
0
s,然后是
NOT
。这里发生了什么?似乎
first&0b01
为零,因此应通过该条件。

这是运算符优先级的问题

位AND运算符
&
的优先级低于相等运算符
=
。因此:

first & 0b10 == 0
同:

first & (0b10 == 0)
这不是你想要的。它比较
0b10
是否等于0,这是错误的。然后计算
第一个&0
,该值为0

添加括号以获得所需的行为:

(first & 0b10) == 0
这就是所谓的

首先评估:

0b10 == 0  // which is false ==> 0
然后

要获得预期结果,请使用括号强制计算顺序:

(first & 0b10) == 0  // this will true ==> 1

因为==的优先级高于&


这里是参考:

优先规则:
first&0b10==0
应该是
(first&0b10==0
,我总是觉得它不直观(我看到许多类似的错误)。我想知道为什么位运算符的优先级比比较低。。。如果你问M..EuGeNeS.H.我的唯一理由是把它们与逻辑和AND或运算符分组,但即使是“代码> > ^ /代码>,<代码>和<代码>,<代码> < />代码> <代码> & & <代码>和<代码> <代码>都处于它们自己的优先级别,同时<代码>!code>和
~
在算术运算符之上。Dennis Ritchie关于
&
==
的相对优先级:
first & 0  // which is also 0
(first & 0b10) == 0  // this will true ==> 1