执行指定位运算后让shot变量等于0,变量a需取什么值?
结论
在C语言标准定义的合法操作场景下,不存在这样的a值可以让shot运算后等于0。
运算逻辑拆解
你给出的代码逐行运算规则如下:
int shot = 0; shot |= 1 << a;
- 第一步
int shot = 0:初始化shot的二进制所有位均为0 - 第二步
1 << a:将整数1的二进制位左移a位,合法输入下(a为非负整数,且小于int类型的比特位数,32位int下即a ≤ 31),运算结果是只有第a位为1、其余位全为0的正整数,值等于2^a - 第三步
shot |= 1 << a:这是按位或赋值操作,按位或的规则是两个数的对应二进制位只要有一个为1,结果位就为1。初始shot全为0,和1 << a的结果做或运算后,最终shot的值就等于2^a,必然是正整数,不可能为0。
如果a取值超出合法范围(比如a为负数、或者a≥int类型的比特位数),此时移位操作属于C语言标准规定的未定义行为,最终结果完全取决于编译器、硬件架构等具体实现,没有可移植的a值能保证shot运算后等于0。
内容的提问来源于stack exchange,提问作者QianIsHere
相关产品推荐
相关产品推荐

