我有以下情况:
#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;
}
两个0
s打印出来,然后NOT
。这是怎么回事吗?这似乎是first & 0b01
是零,因此应该通过的条件。
这是运算符优先级的问题。
按位与运算&
比相等运算==
优先级低。所以这:
first & 0b10 == 0
是相同的:
first & (0b10 == 0)
这是不是你想要的。它比较0b10
与0平等的,这是假的。然后first & 0
被评估其是0。
添加圆括号获得所需的行为:
(first & 0b10) == 0
这就是所谓的operator precedence。
first & 0b10 == 0
首先评价:
0b10 == 0 // which is false ==> 0
然后
first & 0 // which is also 0
为了得到你所期望使用括号强制评估顺序的结果:
(first & 0b10) == 0 // this will true ==> 1
因为==比和更高的优先级。
下面是引用:Operator Precedence