位运算与比较运算符优先级问题:if(18&2==2)为何不执行?
问题解答:位运算与关系运算混合的优先级陷阱
嘿,你猜得完全没错!问题根源就是运算符优先级在搞鬼,这也是很多刚接触位运算的开发者容易踩的坑。咱们一步步拆解你的困惑:
1. 为什么if(18&2==2)无法执行?
C语言里,关系运算符==的优先级远高于位与运算符&,所以这个表达式会被编译器自动解析成:
if( 18 & (2 == 2) )
2==2的结果是1(C语言中布尔真用1表示),接下来计算18 & 1:18的二进制是10010,1的二进制是00001,按位与的结果是0。条件判断为假,所以对应的代码块自然不会执行。
而你单独执行printf("%d",18&2)时,没有优先级更高的运算符干扰,编译器直接计算18 & 2:18的10010和2的00010按位与,结果是00010(十进制2),所以输出完全正常。
2. 为什么if(18|2==18)能正常执行?
同样是优先级在起作用,这个表达式会被解析成:
if( 18 | (2 == 18) )
2==18的结果是0(布尔假),18和0按位或的结果还是18——非零值在C的条件判断里会被视为真,所以代码块能正常执行。
3. 怎么修正这个问题?
解决方法非常直接:给位运算的部分加上括号,明确让编译器先计算位运算,再做关系比较:
- 修正第一个条件:
if( (18 & 2) == 2 ) - 修正第二个条件:
if( (18 | 2) == 18 )
额外提醒
在C语言的运算符优先级体系中,关系运算符(==、!=、<、>等)的优先级高于位运算符(&、|、^)。当这两类运算符混合使用时,一定要用括号明确运算顺序,避免出现这种“逻辑看起来对,但实际执行不符合预期”的陷阱。
内容的提问来源于stack exchange,提问作者Kanishk Tanwar
相关产品推荐
相关产品推荐

