通常在我的代码中,我需要检查x个bool的状态是否为真,或者所有bool都是false。所以我这样做:
BOOL first, second, third;
if((first && second && third) || (!first && !second && !third))
//do something
作为一个懒惰的程序员,我想知道这种查询是否有一些数学简写,而不是每次都要输入这整个东西?
答案 0 :(得分:5)
所有bool相同的简写是测试(成对)平等:
(first==second && second==third)
当然,您可以将此扩展为任意数量的布尔值,并使用和运算符连接N-1
次等级检查。
答案 1 :(得分:3)
如果这是您经常需要的东西,那么最好使用整数并单独读取位。
例如,而不是:
BOOL x; // not this
BOOL y; // not this
BOOL z; // not this
...而不是位字段(因为它们的布局是实现定义的):
unsigned int x : 1; // not this
unsigned int y : 1; // not this
unsigned int z : 1; // not this
... 使用单个字段,例如:
unsigned int flags; // do this
...和将每个值分配到位;例如:
enum { // do this
FLAG_X = (1 << 0),
FLAG_Y = (1 << 1),
FLAG_Z = (1 << 2),
ALL_FLAGS = 0x07 // "all bits are on"
};
然后,要测试“所有错误”,您只需说“if (!flags)
”并测试“全部为真”,您只需说“if (flags == ALL_FLAGS)
”,其中ALL_FLAGS
是一个设置所有的数字有效位为1.其他位运算符可用于根据需要设置或测试各个位。
请注意,在您必须执行更多操作之前,此技术的上限为32个布尔值(例如,创建一个额外的整数字段以存储更多位)。
答案 2 :(得分:2)
检查总和是否等于或等于bool的数量:
((first + second + third) % 3 == 0)
这适用于任意数量的参数。
(但是不要认真对待这个答案并且真实地做。)
答案 3 :(得分:1)
当谈到谓词时,通常可以通过使用两个变量进行量化操作来简化逻辑 - 通用量化(适用于所有)和存在量化(存在)。
BOOL allValues = (value1 && value2 && value3);
BOOL anyValue = (value1 || value2 || value3);
if (allValues || !anyValue) {
... do something
}
如果数组中有很多布尔值,这也可以工作 - 您可以创建一个for
周期来评估这两个变量。