You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

位运算与比较运算符优先级问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:14