在c++中用布尔AND和OR代替



在c++中,是否有类似于布尔的就地AND和OR运算符?

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

(我知道我会写someOk=someOk||funcReturningBoolOnSuccess(i),但它没有那么漂亮)。

答案很简短:不,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;
  }
}

效率高得多:)

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

如果结果不是bool值,那么您可能需要将其转换为该值,因为|=实际上是一个逐位操作。C或C++中的任何基本类型都可以通过!!的简单技巧("bang-bang"或"not not")转换为bool——它使任何非零的true和零结果的false,这正是我们想要的。

我知道它还没有到位,但它更容易使用。

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

最新更新