C语言中与0做按位与运算的if分支为何永远不可达
原因说明
C语言里的&是按位与运算符,运算规则非常明确:两个数做按位与时,只有对应二进制位同时为1,结果的对应位才是1,只要任意一个数的对应位是0,结果的该位就一定是0。
我们可以拆成两种写法分别看计算逻辑:
- 写
some_size_t & 1时,常量1的二进制表示只有最低位(也就是你要检查的LSB)是1,其余所有位全是0。运算后除了最低位会保留some_size_t本身的LSB值,其余位会被全部清零:如果变量LSB是1,整个表达式结果就是非0值,C语言中非0会被判定为逻辑真,正常进入if块;如果LSB是0,表达式结果为0,判定为假不进入块,所以这段代码能正常实现LSB的判断逻辑。 - 写
some_size_t & 0时,常量0的二进制所有位全是0。不管some_size_t本身是什么值、每一位是0还是1,和全0的数做按位与,每一位的计算结果都必然是0,整个表达式的返回值永远是0。而C语言中if判断的规则是括号内表达式值为0就代表条件不成立,会直接跳过整个if块,所以块内的代码永远没有执行的可能,属于标准的不可达代码,开编译器优化的话这段无效代码甚至会被直接剔除。
补充:如果你的需求是判断变量LSB是否为0,正确的写法应该是
if( (some_size_t & 1) == 0 ) { /* LSB为0时执行逻辑 */ },注意按位与的优先级低于相等判断,记得给位运算部分加括号避免逻辑错误。
内容的提问来源于stack exchange,提问作者user14857007
相关产品推荐
相关产品推荐

