运算符逻辑与等于的惯用替代方案? [已关闭]

问题描述 投票:0回答:1

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));
}

这很烦人。我们应该使用什么最常见(备受推崇)的习语?

c++ operators boolean-logic idioms
1个回答
0
投票

如果您为累加器变量使用正确的布尔值(而不是

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 上的行动

注意事项/缺点:

  • 正如 @FredLarson 所指出的,这不会给你带来短路行为。也就是说,如果
    all_ok
    已经为 false,您仍将始终运行所有其余代码。
  • 编译器可能会警告您将
    *=
    与布尔值一起使用:
    warning: '*' in boolean context, suggest '&&' instead [-Wint-in-bool-context]
    
    (尽管您可以禁用该警告)
© www.soinside.com 2019 - 2024. All rights reserved.