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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:24:00