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