沿着这条线,在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 (如成功时为真)...您为什么不只使用以下内容?
someOk = funcReturningBoolOnSuccess(i);
无论如何它不会在失败时返回 false 吗?似乎不合逻辑。
你为什么不这样做:
bool someOk=false;
for(int i=0; i<10; i++){
if (funcReturningBoolOnSuccess(i)) {
someOk = true;
break;
}
}
效率更高:)
只要 return 是bool
,您就可以|=
用于此目的(除非您严格希望避免funcReturningBoolOnSuccess(i);
在第一次成功后调用 - 在这种情况下,您必须使用一些if
和break
或更改for
循环的条件)。
如果结果不是bool
值,那么您可能需要将其转换为该值,因为|=
确实是按位运算。C 或 C++ 中的任何基本类型都可以通过 ("bang-bang" 或 "not-not")bool
的简单技巧转换为 a !!
- 它生成true
任何非零和false
零结果的 a,这就是我们想要的.
我知道它不是就地的,但它更容易使用。
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);