有没有简便方法判断一组变量是否全部初始化或全部未初始化?
问题梳理
你提供的判断逻辑存在两处笔误:变量名handle错写为handles,且判断条件与变量名bAreAllUnitialised完全不匹配,你实际想实现的所有变量均已初始化的正确判断逻辑应该是:
bool bAreAllInitialised = (handle != -1) && (ptrToSomethingImportant != NULL) && bHasBeenInitialised;
你遇到的问题符合逻辑运算的德摩根定律:对逻辑与的结果取反会得到逻辑或的结果,即!bAreAllInitialised等价于「至少有一个变量未初始化」,确实无法直接得到「所有变量均未初始化」的判断结果。
实现方案
不需要做复杂的逻辑转换,有三种常见的实现方式,可根据你的场景选择:
方案1:直接写双判断(最易读,小规模代码推荐)
直接分别编写全初始化、全未初始化的判断逻辑即可,代码可读性最高,维护成本最低:
// 所有变量均已初始化 bool bAllInitialised = (handle != -1) && (ptrToSomethingImportant != NULL) && bHasBeenInitialised; // 所有变量均未初始化 bool bAllUninitialised = (handle == -1) && (ptrToSomethingImportant == NULL) && !bHasBeenInitialised; // 额外可以直接判断状态是否符合「全初始化/全未初始化」的要求 bool bStateValid = bAllInitialised || bAllUninitialised;
方案2:位状态聚合(适合变量较多、后续会扩展的场景)
如果后续关联的状态变量会增加,可以把每个变量的初始化判断结果按位存储到同一个整数中,合法状态只有全0(全未初始化)和全1(全已初始化),不需要重复写判断逻辑:
uint8_t initState = 0; initState |= (handle != -1) << 0; initState |= (ptrToSomethingImportant != NULL) << 1; initState |= (bHasBeenInitialised) << 2; bool bAllInitialised = (initState == 0b111); bool bAllUninitialised = (initState == 0); bool bStateValid = (initState == 0 || initState == 0b111);
后续新增变量只需要加一行位操作代码即可,不需要修改后续的判断逻辑。
方案3:封装为结构体函数(工程化项目推荐)
如果这组变量是关联的业务资源,最好直接封装为结构体,把判断逻辑封装为内联函数,避免后续维护时变量名写错、判断条件漏改的问题:
typedef struct { int handle; void* ptrToSomethingImportant; bool bHasBeenInitialised; } ResourceContext; // 判断是否全已初始化 static inline bool isContextInitialised(const ResourceContext* ctx) { return ctx->handle != -1 && ctx->ptrToSomethingImportant != NULL && ctx->bHasBeenInitialised; } // 判断是否全未初始化 static inline bool isContextUninitialised(const ResourceContext* ctx) { return ctx->handle == -1 && ctx->ptrToSomethingImportant == NULL && !ctx->bHasBeenInitialised; } // 判断状态是否合法 static inline bool isContextStateValid(const ResourceContext* ctx) { return isContextInitialised(ctx) || isContextUninitialised(ctx); }
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

