C++中枚举与unsigned char配合位操作时输出结果异常为0问题
问题修复说明
核心错误原因
问题与枚举类型没有任何关联,根本原因是C++默认函数参数为传值调用:你在RentCar、ReturnCar中修改的形参f只是外部实参的临时副本,修改结果不会回写到main函数中的fleet变量,所以你观察到fleet一直是0。
你之前直接定义unsigned char Car0 = 1时运行正常,是因为你直接修改的是原始变量,没有经过函数传值的副本传递,和枚举常量本身无关。
修复代码
只需要把两个修改车辆状态的函数的第一个参数改为引用传递即可,同时优化ReturnCar的逻辑(原逻辑用异或存在风险,如果对应位本来是0会被误设为1,用取反后按位与的逻辑更稳妥):
#include <iostream> using namespace std; enum CARS { Car0 = 1, Car1 = 2, Car2 = 4, Car3 = 8, Car4 = 16, Car5 = 32, Car6 = 64, Car7 = 128 }; // 加&改为引用传递,函数内修改会同步到外部实参 void RentCar(unsigned char& f, CARS c) { f = f | c; } // 改为引用传递,同时优化归还逻辑 void ReturnCar(unsigned char& f, CARS c) { f &= ~c; } bool RentalStatus(unsigned char f, CARS c) { return (f & c) == c; } int main() { unsigned char fleet = 0; // 1 byte, 1 bit per car status cout << (int) fleet << endl; RentCar(fleet, Car0); cout << (int) fleet << endl; cout << RentalStatus(fleet, Car0); return 0; }
运行结果
修复后输出为:
0 1 1
如果你预期第三个输出为0,说明你把RentalStatus的返回值含义搞反了:当前返回true代表对应车辆已被租用,false代表可租用,你刚刚租用了Car0,所以状态返回1属于正常结果。
内容的提问来源于stack exchange,提问作者JEKBURRI
相关产品推荐
相关产品推荐

