C++ 有用于算术 (+,-,*,/) 以及按位运算 AND 和 OR 的“累加器”运算 - 但不用于逻辑运算。
现在,在我们的代码中,我们有时需要连接许多布尔值 - 就像我们需要对多个算术值求和一样。但是虽然我们可以写:
int sum { 0 };
sum += foo();
sum += (bar * baz);
sum += quux() ? 5 : 2;
for (int i = 1; i < n; i++) {
sum += arr[get_index(i)];
}
我们似乎被降级为写作
bool all_ok { true };
all_ok = all_ok and (foo() == GoodFoo);
all_ok = all_ok and (bar * baz > 3);
all_ok = all_ok and quux();
for (int i = 1; i < n; i++) {
all_ok = all_ok and (arr[get_index(i)] == expected(i));
}
这很烦人。我们应该使用什么最常见(备受推崇)的习语?
如果您为累加器变量使用正确的布尔值(而不是
int
),则可以使用布尔值的加法和乘法语义 - 我相信您不会惊讶于学习对应于逻辑析取(分别为or
)和合取(and
)。
所以你可以写:
bool all_ok { true };
all_ok *= (foo() == GoodFoo);
all_ok *= (bar * baz > 3);
all_ok *= quux();
for (int i = 1; i < n; i++) {
all_ok *= (arr[get_index(i)] == expected(i));
}
看到它(嗯,类似的东西)在 GodBolt 上的行动。
注意事项/缺点:
all_ok
已经为 false,您仍将始终运行所有其余代码。*=
与布尔值一起使用:
warning: '*' in boolean context, suggest '&&' instead [-Wint-in-bool-context]
(尽管您可以禁用该警告)