在这行中是否存在类似于c ++的bool的就地AND和OR运算符?
bool someOk=false;
for(int i=0; i<10; i++){
someOk||=funcReturningBoolOnSuccess(i);
}
(我知道我可以写someOk=someOk||funcReturningBoolOnSuccess(i)
,但它不是很漂亮。)
答案 0 :(得分:3)
答案很简短:不,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;
}
}
效率更高:)
答案 1 :(得分:1)
只要返回bool
,您就可以|=
用于此目的(除非您严格要求在第一次成功后调用funcReturningBoolOnSuccess(i);
- 在这种情况下您必须使用一些if
和break
或更改for
循环的条件。
如果结果不是bool
值,那么您可能需要将其转换为该值,因为|=
确实是按位运算。通过bool
(&#34; bang-bang&#34;或&#34; not-not&#34;)的简单技巧,可以将C或C ++中的任何基本类型转换为!!
。 - 它使true
的任何非零和false
的结果为零,这就是我们想要的。
答案 2 :(得分:0)
我知道它不是就地,但它更容易使用。
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);