【问题标题】:in-place bool AND and OR in c++?c++中的就地布尔AND和OR?
【发布时间】:2013-07-09 12:19:33
【问题描述】:

在 C++ 中是否有类似就地 AND 和 OR 运算符的东西?

bool someOk=false;
for(int i=0; i<10; i++){
  someOk||=funcReturningBoolOnSuccess(i);
}

(我知道我可以写someOk=someOk||funcReturningBoolOnSuccess(i),但它不那么漂亮)。

【问题讨论】:

  • 您在寻找|=
  • 不,|= 是按位计算的。
  • @eudoxos:除非您需要短路功能,否则 |= 的工作原理相同。并且没有 ||= 或等价物。如果你经常需要它,你可以编写自己的小函数来完成它。
  • 不是答案,但出于与示例类似的目的,您可以尝试 std::any_of en.cppreference.com/w/cpp/algorithm/all_any_none_of

标签: c++ boolean operators in-place


【解决方案1】:

答案很简短:不,C++ 语法不允许这样的结构。

你必须使用:

something = something || something_else;

但是....如果您的函数在成功时返回 bool(如成功时返回 true)...您为什么不直接使用以下内容?

someOk = funcReturningBoolOnSuccess(i);

无论如何它不会在失败时返回 false 吗?似乎不合逻辑。

你为什么不这样做:

bool someOk=false;
for(int i=0; i<10; i++){
  if (funcReturningBoolOnSuccess(i)) {
      someOk = true;
      break;
  }
}

效率更高:)

【讨论】:

  • 那你为什么不在它是真的之后break呢?
  • 我想应该在函数返回true 后立即终止循环 - 无需检查其余值。
  • 被划掉的部分是这个答案的组成部分吗?如果没有,那么只需将其删除。如果有人真的需要查看,编辑历史会保留一份副本。如果保持它可见很重要,你能用语言解释它有什么问题,而不是简单地把它划掉吗?我不清楚意思。
【解决方案2】:

只要返回是bool,您就可以为此目的使用|=(除非您严格希望避免在第一次成功后调用funcReturningBoolOnSuccess(i); - 在这种情况下您必须使用一些ifbreak 或更改 for 循环的条件)。

如果结果不是bool 值,那么您可能需要将其转换为该值,因为|= 确实是按位运算。 C 或 C++ 中的任何基本类型都可以通过 !!(“bang-bang”或“not-not”)的简单技巧转换为 bool - 它可以生成任何非零的 true 和 @ 987654332@ 的结果为零,这正是我们想要的。

【讨论】:

  • 我的猜测是bool 的表示是实现定义的,所以使用|= 可能无法正常工作?
  • 我不明白为什么会导致问题。 truefalse 应该仍然是两个常量值(并且可以根据标准中的第 4.5 节将它们转换为整数),无论实际的二进制位模式是什么。虽然我不知道有任何实现将true 设为 1 以外的值,但我想在某些架构中它可能是 3、6 或 42。
  • boolint 的提升定义明确:true 变为 1。这与用于在内部表示值的任何位模式无关。
【解决方案3】:

我知道它不是就地的,但它更容易使用。

void OR(bool& x,bool y)
{
   x = x || y;
}

/* later on */

bool someOk = false;

// someOk = false
// funcRetBoolOnSuc(8) = false
OR(someOk,funcRetBoolOnSuc(8));
// someOk = false

// someOk = false
// funcRetBoolOnSuc(8) = true
OR(someOk,funcRetBoolOnSuc(9));
// someOk = true

或者,因为 bool 只接受 0,1 作为值,您可以这样做:

someOk |= funcRetBoolOnSuc(x);

【讨论】:

  • 请注意,无论是函数还是 |= 运算符都没有表现出我们对假设的 ||= 运算符所期望的短路行为; funcRetBoolOnSuccess 将始终被调用,即使 someOk 已经为真。
猜你喜欢
  • 2020-10-12
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多