我遇到以下情况:
#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
,然后打印NOT
。这是怎么回事first & 0b01
似乎为零,因此应通过条件。
答案 0 :(得分:3)
这是运算符优先级的问题。
按位AND运算符&
的优先级低于相等运算符==
的优先级。所以这个:
first & 0b10 == 0
与:
first & (0b10 == 0)
这不是您想要的。它将0b10
的相等性与0进行比较,这是错误的。然后计算first & 0
为0。
添加括号以获得所需的行为:
(first & 0b10) == 0
答案 1 :(得分:2)
first & 0b10 == 0
首次评估:
0b10 == 0 // which is false ==> 0
然后
first & 0 // which is also 0
要获得预期结果,请使用括号来强制求值顺序:
(first & 0b10) == 0 // this will true ==> 1
答案 2 :(得分:1)
因为==的优先级高于&。
这里是参考:Operator Precedence