在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);
——在这种情况下,您必须使用一些if
和break
,或者更改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);