C语言位运算|=替代赋值的原因及&运算返回值类型问题
C语言位操作示例问题解答
问题1:为什么使用flock |= FLOCK_JAY;实现添加松鸦,而不直接写为flock = FLOCK_JAY?
这里的flock是位掩码类型的变量,每一个二进制位对应一种鸦科鸟类的存在状态,单个变量可以同时存储多种鸟类的存在标记。
|=是按位或赋值运算符,作用是仅将FLOCK_JAY对应的二进制位设置为1,其余所有位的原有状态保持不变。比如flock之前已经存储了喜鹊的标记,执行该语句后会同时保留喜鹊和松鸦的标记,符合「添加成员」的需求。- 如果直接使用赋值运算符
flock = FLOCK_JAY,会清空flock中所有已有的鸟类标记,最终只会保留松鸦的状态,完全丢失之前添加的其他鸟类信息,不符合位掩码管理多状态的设计目的。
问题2:条件判断中的flock & FLOCK_CHOUGH表达式返回值是否为bool类型?
不是。
按位与运算符&的两个操作数都是unsigned类型,根据C语言的隐式类型转换规则,最终运算结果的类型也是unsigned:
- 如果
flock中存在红嘴山鸦对应的标记位,表达式返回值为8U(即FLOCK_CHOUGH本身的常量值) - 如果不存在对应标记,表达式返回值为
0U
C语言的条件判断逻辑会自动将所有非0整数值判定为「真」,0判定为「假」,所以该表达式可以直接放在if的判断条件中使用,但它本身的类型并不是bool(C99标准才引入_Bool类型,bool是其别名,需要引入stdbool.h头文件才可直接使用)。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

